A felszabadulás a dinamikusan allokált memória programozási

(1) terminológiát. A nevét az üzemeltetők félrevezető, de az új - az, hogy hozzon létre egy objektumot. álló memória kiosztás és hívja a kivitelező, és törölje - megsemmisíti az objektumot, azaz hívja a destruktor és a szabad memória. Megjegyzés kiosztani és engedje törlés helyett.

(2) (Finoman egyszerűsítése :) folyamat visszatér az új mutató értéke és a mutató törlési művelet lekéri az értéket. Felhívjuk figyelmét, - fontos volt mindkét esetben. Ez különösen azt jelenti, hogy ha tárolja egy mutatót a változó, a változó értéke nem fog változni, ha a tárgy megsemmisül. Néha fájdalmas és szomorú, hogy emlékezzen.

(3) törlése után a memória tartalmát memória kiszámíthatatlanul. Különösen akkor lehet újra felhasználni.

int * a = new int # 40, # 41 ;;
* A = 5;
törlése;

int * b = new int # 40, # 41 ;;
* B = 3;
printf # 40; "a =, b =.", * a, * b # 41 ;;

int * a = new int # 40, # 41 ;;
* A = 5;
törlése;
törlése;

De vannak még érdekes lehetőség:

int * a = new int # 40, # 41 ;;
int * b = A;
* A = 5;
törlése;

int * c = new int # 40, # 41 ;;
* C = 3;

int * d = new int # 40, # 41 ;;
* D = 7;
printf # 40; ".. c = d =", * c, * d # 41 ;;

Nem egyértelmű, hogy a c véletlenül eltávolították, és úgy néz ki, mintha a c érték változott is.


Azokban az esetekben, súlyos elhízás (teljesség teljesség) kép:

(1) új és törölni felülírható nemcsak az órákon, hanem globális szinten is. Ez nagyon gyakran használják a beágyazott rendszerek, ahol a szokásos alloc () / free () nem állnak rendelkezésre, vagy nem kívánatos (elképzelni ACS NPP, ami nem elég memória!).

De - szép - és ez lehet nyomon követésére használt befogó / release a memória.

Másrészt, ez az egész káosz még mindig tart, hogy kiadja a memória. Ezért a memória tartalom változhat, ha a free ().

(3) Az összes ilyen „okos” mutatókat - változók. ahelyett értékek (smartptr ptr helyett T * ptr). Különösen akkor automatikusan semmissé az eltárolt érték alatt a felszabadulás. És azt hiszi vagy linkeket, illetve nem teszi lehetővé, hogy másolni egy mutatót. Szigorúan véve, új / törölni a közvetve érinti. És meg kell fizetni közvetlenül: valójában okos mutató, és a szervező a program körül őket.

Miért, miután egy blokk memória a koto mutató utal, ingyenesek, ez a blokk a változásokat?


Megvalósítása a fordító, az operációs rendszer, a PC architektúra.
Szem előtt tartani, hogy a fordító nagyon szorosan együttműködik az operációs rendszer, amikor dinamikusan memóriát. Sőt, ő is kérni kell kiosztani másik blokk memória a kupac, vagy vissza a felszabadult blokkot a rendszer.

És ahol minden a program kezdetekor változik az azonos értékű (-572 662 307).


Mivel a rendszer minden alkalommal futtatja a programot „a semmiből”, és ugyanabban a környezetben, a viselkedése az operációs rendszer, a kódban a program egy külön OS darab memória a program. Még a mag a rand () egy jól definiált alapértelmezett értéket, ami garantálja a folyamatos sorozata véletlen számok, ha hirtelen használni őket, és ez történik, szándékosan -, hogy egyszerűsítse a hibakeresés.
De általánosságban elmondható, hogy nem lehet a helyzet.

Meg kell érteni, egy dolog -, hogy megértsék, hogyan és mi történik, miután eltávolították a tárgy, amelyre a mutató, ami azt jelenti, vegye nyitott egészen, talán a belső építészet a CPU és a szállítószalag parancsokat. Amennyiben nem zavarja ez a kérdés csak akkor, ha nem egy hacker. A programozó kell kerülni az ilyen helyzetek általában.

crasher írta (a):

Ez egy nagyon erős állítás. A jog nem mindig és nem mindenhol. Az első helyen, nem a fordító és a könyvtár. Másodszor, a könyvtár nem lép kölcsönhatásba a tengelyt.


Először is, teljes mértékben egyetértek, hogy a malloc - függvénykönyvtár.
Másodszor, a hozzászólásomat ott osztom meg közelítés, de ésszerű közelítését. Nem tudom elképzelni, hogy a könyvtár nem tud lépni a modern OS munka közben a memória. Pontosan adja meg a két lehetőség:
1. Előre fenntartva bizonyos korlátozott mennyiségű memóriát a kupac, és túlmutat a program nem tud kijutni - malloc NULL kérésekor több memóriát, mint ami jelenleg elérhető a kupac.
2. Van egy kísérlet arra, hogy elfoglalja az összes rendelkezésre álló memória a program. Nos, hogy ez képtelenség definíció szerint.

Így arra a következtetésre jutottam, hogy a funkciók a memória dinamikus és engedje meg a jelenlegi fejlődési szakaszában a számítástechnika, csak ki kell szorosan működjön együtt az operációs rendszer ezt a kérdést.

crasher írta (a):

Nem tudom, hogy mennyi a C ++ szabvány, így nem biztos -, hogy az alapértelmezett új () közös hívást malloc () vagy nem.

crasher írta (a):

Egyszerűen tudta, a standard - ez egy nagyon speciális tudást. Ez kétségtelenül egy fejlesztő szüksége van egy fordító és könyvtárak. És akkor? Nem tudom. A tudás a nyelvi norma szükséges hordozható programok - sok különböző fordítóprogramok.


Megpróbálok írni hordozható kódot kezdetben, még ha abban a pillanatban ez nem szükséges a projektben. Csak bármikor vehet, és szüksége.
Természetesen nem szabványokat tanulmányozták mélyen, sok feledésbe merült, de mégis, ez egy kód hordozhatósága fel az egyik első követelményeknek. Ellenkező esetben, feladjuk az egyik fő előnye a C / C ++ - annak megvalósíthatósága szinte minden platformon. Aztán minden bizonnyal előnyös valami szép - Java napirimer az akció. feladatok - python, php, perl, stb stb

De igazából nem értem szabványok, és a C ++ egyáltalán. Ha olvasni egy könyvet Jeff Alger „C ++”, rájöttem, hogy a közelmúltban azt mondta Bache „Tudom, hogy a C ++, de nem tudom, hogyan kell írni programokat rajta.”
Ez lehet csavarni, és csavarva ésszerűen, hogy veszi a lélegzete. Használata sok finomságok, hogy a programozók nem használja szinte soha (minden esetben, a tapasztalat azt mondja róla).

Ezért felteszem a kérdést -, hogy hány ember általában használja OOP / C ++, a működési folyamatok, hogy a társadalom fejlesztésének C ++ (vagy akármi is hívják) jön ki évente, és indokolja?

Azt nem lehet mondani Borland'tsah - ők Builder'e letiltja a többszörös öröklődés VCL-osztály (!). mindenhol elvét is megsértette a tokozás, stb

2. Van egy kísérlet arra, hogy elfoglalja az összes rendelkezésre álló memória a program. Hát ez hülyeség definíció


Nos, miért is tenném? Ez teljesen normális stratégia beágyazott rendszerek. Előtt vagy után a kernel inicializálása (attól függően, hogy a magok), futásidejű veszi az összes memóriát, és ellenőrzi azt.

Az új - ez az üzemeltető, amelynek viselkedése (zavartalan) kell maradnia kiszámítható és azonos belül legalább ezt a fordító, akkor nem hajtjuk végre a F-II malloc.


Miért? Miért nem lehet előre látni?

ebben az új malloc jobb, mert lehetővé teszi, hogy ellenőrizze a fajta


Ez nem lényeges. Elengedhetetlen, hogy az új felhívja a kivitelező, és malloc () - nincs. Hasonlítsuk össze a végeredmény új (header file ).

nyilvánvaló, hogy az új nem lép kölcsönhatásba a malloc () - használja őket egy program jogszerű.

Ez lehet csavarni, és csavarva ésszerűen, hogy veszi a lélegzete. Használata sok finomságok, hogy a programozók nem használja szinte soha (minden esetben, a tapasztalat azt mondja róla).


Programozó (bármilyen) a nyelv (bármilyen), hogy megoldja a problémát, mindig egy részét a nyelvet. Csakúgy, mint a nyelv az írás eltér a magyarázatok a sör állvány eltér Óda Vlagyimir Vlagyimirovics ™.

Problémák merülnek fel, amikor általában kívül esnek ezen alcsoportja túlságosan nagy mennyiségű nyelvet. Ebben az esetben van emészthetetlen hibaüzenetek „nem világos, hogy mit csinálnak” a program egyes részeit, stb