Dynamická alokace paměti – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Dynamická alokace paměti – C / C++ – Fórum – Programujte.comDynamická alokace paměti – C / C++ – Fórum – Programujte.com

 

Duch
15. 4. 2006   #1
-
0
-

// Frosty edit: Tam, kde je naps?no [i.] to m? b?t bez t? te?ky. Upravil jsem to tak, proto?e F?rum to form?tuje jako kurz?vu.

Mrkn?te se na tento k?d:



#include <cstdlib>
#include <iostream>

using namespace std;

char* allocate_mem(char* c, int size) {
char* a = new char[size];
for(int i = 0; i != size; i++)
a[i.] = c[i.];
return c;
};

int main(int argc, char *argv[])
{
char* pa = allocate_mem("abcdef", 6);
cout << "Adresa 'pa': " << &pa << endl;
char ca[10] = "abcdefghi";
char* da = allocate_mem(ca, 10);
cout << "Adresa 'da': " << &da << endl; //Vsimnete si rozdilu
cout << "Hodnota 'da':" << da << endl;
cout << "Adresa 'ca': " << &ca << endl;
cout << "Hodnota 'ca':" << ca << endl;
int ia[10];
cout << "Adresa 'ia': " << ia << endl; //ALE !!!
delete []pa;
delete []da;
char cdf[9] = "12345678";
cout << "[del] Adresa 'da': " << &da << endl;
cout << "[del] Hodnota 'da':" << da << endl;
cout << "[del] Adresa 'ca': " << &ca << endl;
cout << "[del] Hodnota 'ca':" << ca << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Jak je mo?n?, ?e po smaz?n? dynamycky alokovan?ch prom?nn?ch oper?torem delete lze s nimy i nad?le pracovat? Zkou?el jsem to kompilovat v MinGW - debugger nic nehl?sil, posl?ze v M$ kompil?toru - debugger mi akor?t navrhl p?eru?en? b?hu programu po oper?torech delete.

Nahlásit jako SPAM
IP: ...–
Lukáš Churý
~ Šéfredaktor
+8
Hero
15. 4. 2006   #2
-
0
-

proto?e m?sto je uvoln?no pro dal?? alokace, resp pro dal?? pou?it?. Pokud ale pou?ito nebylo, lze ho teoreticky volat.

>> vol?n? dynamicky alokovan? prom?nn? po DELETE -> nedefinovan? chov?n

Nahlásit jako SPAM
IP: ...–
Guitar Hero Master, Project führer & zdejší čaroděj.
Sleduj mě na twitteru – @lukaschury.
Jura_0
Stálý člen
15. 4. 2006   #3
-
0
-



#include <cstdlib>
#include <iostream>

using namespace std;
// tady jste vytvoril docela pekny memory leak - protoze jste vracel retezec c misto a
char* allocate_mem(char* c, int size) {
char* a = new char[size];
int j;
for(j = 0; j != size; j++)
a[j] = c[j];
a[j] = '\0'; // v C se ukoncuji retezce nulou
return a;//c;
};

int main(int argc, char *argv[])
{
char* pa = allocate_mem("abcdef", 6);
cout << "Adresa 'pa': " << &pa << endl;
char ca[10] = "abcdefghi";
char* da = allocate_mem(ca, 10);
cout << "Adresa 'da': " << &da << endl; //Vsimnete si rozdilu
cout << "Hodnota 'da':" << da << endl;
cout << "Adresa 'ca': " << &ca << endl;
cout << "Hodnota 'ca':" << ca << endl;
int ia[10];
cout << "Adresa 'ia': " << ia << endl; //ALE !!!
delete []pa;
delete []da;
pa = da = 0; // po dealokaci je potreba priradit NULL
char cdf[9] = "12345678";
cout << "[del] Adresa 'da': " << &da << endl;
cout << "[del] Hodnota 'da':" << da << endl;
cout << "[del] Adresa 'ca': " << &ca << endl;
cout << "[del] Hodnota 'ca':" << ca << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Na chovani delete jsem se dival do standardu, ale moc moudry jsem z toho nebyl - vetsinou se tam psalo, o tom kdy a jak pouzit nebo pretizit operator delete. Ale jinak vetsinou se po dealokaci pameti, se ukazatelum priaradi hodnota 0(nebo NULL).

Nahlásit jako SPAM
IP: ...–
Duch
15. 4. 2006   #4
-
0
-

Tak jsem trochu experimentoval:



#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
char m = 'F';
cout << m << endl;
char* a = new char[70];
int j;
for(j = 0; j != 70; j++)
a[j] = 'X';
a[j] = '';
cout << &a << endl;
char f[70];
for(j = 0; j != 70; j++)
f[j] = a[j];
delete []a;
//Nelze ozna?it jako voln? m?sto:
delete []f; // statick? prom?nn?
//Kompil?tor pouze upozorn?
char* s = f;
cout << &f << " " << &s << " " << &a << endl;
cout << a << endl;
cout << s << endl;
cout << f << endl;
int i(0);
system("PAUSE");
return 0;
}

Tento k?d dokazuje, ?e Curo m? naprostou pravdu, pam?? je pouze ozna?ena jako pr?zdn?, ne smaz?na(Jak jsem si p?vodn? myslel dle zn?n? oper?toru 'delete'). Prom?nn? 'a' je skute?n? p?eps?na.
Av?ak co je zaj?mav?:
P?eklada? MinGW:
V klidu zkompiluje a upozorn? na smaz?n? pole 'f', program b??? jak s debug k?dem, tak i bez n?j a prom?nn? 'a' se nevyp??e.
P?eklada? od M$:
T?? bez probl?mu zkompiluje a upozorn? na smaz?n? pole 'f', ale program b??? jen s debug k?dem a nam?sto prom?nn? 'a' vyp??e n?jak? nesmysl. ?ist? program funguje a? do p??kazu s v?pisem 'a', potom Win nahl?s?, ?e v aplikaci do?lo k probl?mu a je t?eba ji zav??t.
I kdy? se kompil?toru daj? nastavit r?zn? parametry, stejn? je pravd?podobn? odpov?dnost za vol?n? smazan?, dynamicky alokovan? pam?ti na program?torovi.

Nahlásit jako SPAM
IP: ...–
some_one0
Návštěvník
15. 4. 2006   #5
-
0
-

d1ce napsal:

I když se kompilátoru dají nastavit různé parametry, stejně je pravděpodobná odpovědnost za volání smazaní, dynamicky alokované paměti na programátorovi.



jj, v C++ to tak je, nejsou zde žádne garbage collectory jako v Javě nebo .NETu.

btw: voláním delete značíte, že paměť bude uvolna (neznamená implicitně že bude smazána (imho je blbost aby se mazala = zbytečná operace navíc), nebo že bude pointer přesměrován na null, prostě se ten úsek stane volným, a bude si ho moci vzít jiné proměnné, nebo jiný proces (přiděluje OS) -> to často způsobí nechvalně známou chybu 0x0C00004 ? (nebo kolik?) - program nemá přístup k něčemu. resp znamená to že si ji vzal windows od vašeho programu a třeba to už přidělil jinému programu - je tedy jasné, že váš kód nemá do této oblasti vůbec co šahat, (Mimochodem tahle ochrana je až od NT na Win98 jste mohli šahat kam jste chtěli (tuším že i do prvních 64bajtů, a hádejte kdo tam sídlí :-))

Nahlásit jako SPAM
IP: ...–
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, 88 hostů

Moderátoři diskuze

 

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