Jak uvolnit pamět? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jak uvolnit pamět? – C / C++ – Fórum – Programujte.comJak uvolnit pamět? – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
dasd
~ Anonymní uživatel
2 příspěvky
3. 11. 2015   #1
-
0
-

   

#include <iostream>
#include <cstring>
using namespace std;

struct stringy {
	char * str;
	int ct;
};
void set(stringy & stru, char tes[]);
void show(stringy & stru, short x = 1);
void show(char tes[], short x = 1);

int main ()
{
	stringy beany;
	char testing[] = "Opravdu neni, co byval.";
	set (beany, testing);
	show(beany);
	show(beany,2);
	testing[0] = 'D';
	testing[1] = 'u';
	show (testing);
	show(testing, 3);
	show("Hotovo!");
	
	delete [] stringy.str;   //co tohle?
	
	return 0;
}

void set(stringy & stru, char tes[]){
	char * pt = new char [strlen(tes) - 1];   //tuhle pamet potrebuju uvolnit
	pt = tes;
	stru.str = pt;
}

void show(stringy & stru, short x){
	cout << stru.str<<endl;
}

void show(char tes[], short x){
	for (int i = 0; i <= x; i++)
	cout << tes << endl;
}

Díky moc!

Nahlásit jako SPAM
IP: 94.74.242.–
Reklama
Reklama
PiranhaGreg0
Stálý člen
3. 11. 2015   #2
-
0
-

No, no, no... máš to nějaký divoký hele. Nejhorší je tato část

char * pt = new char [strlen(tes) - 1]; //tuhle pamet potrebuju uvolnit
pt = tes;

Vytvoříš si někde v paměti místo pro pole znaků (navíc o dva menší než by mělo být (hint)), na to se pak ale rozhodneš vykašlat a odkazuješ se na ten starý string a v paměti zůstane memory leak. Pokus o delete pak samozřejmě nedopadne, neboť nemůžeš uvolnit staticky alokovanou paměť.

Nahlásit jako SPAM
IP: 147.32.126.–
PiranhaGreg0
Stálý člen
3. 11. 2015   #3
-
0
-

Tady máš trochu rozumnější verzi 

#include <iostream>
#include <cstring>

using namespace std;

struct cstring {
	char * str;
	int length;
};

cstring init(char input[]) {
	cstring str;

	str.length = strlen(input);
	str.str = new char[str.length + 1];
	strcpy(str.str, input);

	return str;
}

void free(cstring str) {
	delete[] str.str;
}

void show(cstring & str) {
	cout << str.str << endl;
}

void show(char str[], size_t length) {
	for (size_t i = 0; i < length; i++)
		cout << str[i] << endl;
}

int main() {
	char testing[] = "Opravdu neni, co byval.";
	cstring beany = init(testing);
	
	show(beany);

	testing[0] = 'D';
	testing[1] = 'u';
	
	show(testing, 3);

	free(beany);
	return 0;
}

Jinak ale nezapomeň, že C++ už svou třídu string má  .

Nahlásit jako SPAM
IP: 147.32.126.–
KIIV+42
God of flame
3. 11. 2015   #4
-
+1
-
Zajímavé

C++ ma i objekty. Takze kdyz uz duplikuje funkcionalitu standardni knihovny, tak by to mohl udelat aspon objektove. Taky by se mu retezec zrusil v destruktoru, pointer a delka by se zase vycistily v konstruktoru.

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dasd
~ Anonymní uživatel
2 příspěvky
4. 11. 2015   #5
-
0
-

Díky moc, takže jestli to chápu správně, tak můžu uvolnit dynamickou pamět ve funkci mimo funkci jen, když bude ta dynamická pamět návratovou hodnotou. Samozřejmě za předpokladu, že ji nechci uvolnit hned ve funkci.

A nešlo by třeba:

delete[] init(testing);   //???

Nahlásit jako SPAM
IP: 94.74.242.–
PiranhaGreg0
Stálý člen
4. 11. 2015   #6
-
0
-

Kdyžtak 

delete[] init(testing).str;

Ale pochopil jsi to špatně. Dynamicky alokovanou paměť "můžeš" uvolnit kdykoliv a kdekoliv. Jde jen o to, aby jsi uvolňoval tu správnou paměť. Ty sis tam přepsal ukazatel a pak ses snažil uvolnit něco, co jsi ani nikdy nealokoval  .

Nahlásit jako SPAM
IP: 147.32.126.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 72 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý