WebHU - Programozási kérdések és válaszok

Törölje a void* mutatót a c++-ban

C++-ban való gondolkodást olvasok, 13. fejezet: dinamikus objektumkészítés. Ebben a fejezetben Eckel a void* törléséről beszélt valószínűleg egy hiba. A következő bekezdés összezavar.

A másik memóriaszivárgási probléma azzal kapcsolatos, hogy megbizonyosodjon arról, hogy a tárolóban lévő minden egyes objektummutató esetében a törlés valóban megtörténik. A tároló nem tudja „tulajdonolni” a mutatót, mert üres helyen tartja*, és így nem tudja végrehajtani a megfelelő tisztítást. A tárgyak eltakarításáért a felhasználónak kell felelnie. Ez komoly problémát okoz, ha mutatókat ad hozzá a veremben létrehozott objektumokhoz és a kupacban létrehozott objektumokhoz ugyanahhoz a tárolóhoz, mert a törlési kifejezés nem biztonságos egy olyan mutató esetében, amely nincs lefoglalva a kupacban.

Valaki el tudná magyarázni részletesebben, hogy miért jelent komoly problémát "mutatók hozzáadása a veremben létrehozott objektumokhoz és a kupacban létrehozott objektumokhoz ugyanahhoz a tárolóhoz"?

A probléma egyértelműbbé tétele érdekében hozzáadom a kapcsolódó kódrészletet.

class Stack {
  struct Link {
    void* data;
    Link* next;
    void initialize(void* dat, Link* nxt);
  }* head;
public:
  void initialize();
  void push(void* dat);
  void* peek();
  void* pop();
  void cleanup();
};
08.04.2013

  • Szerintem félreértetted a jelentéseket. Kijelenti, hogy nem törölhet void *-t egy nem triviális objektumhoz, és külön azt, hogy nem törölheti azokat a mutatókat, amelyek a veremre mutathatnak. 08.04.2013
  • Biztonságos törölni egy üres mutatót? 07.05.2013

Válaszok:


1

Általános szabály, hogy a veremben lévő objektumokat nem kell törölni, hanem a kupacban lévő objektumokat. Ha ugyanabba a tárolóba helyezi őket, hogyan tudja nyomon követni, hogy melyiket kell törölni? Jobb, ha két konténer van, az egyik a veremben lévő objektumok számára (azok, amelyeket nem kell törölni), a másik a kupacban lévő objektumok számára (azok, amelyeket törölni kell).

08.04.2013
  • Vagy ami még jobb, hagyja, hogy a tároló kezelje az elosztást, hogy ne kelljen manuálisan hívnia a delete funkciót – RAII. 08.04.2013

  • 2

    Ez a bekezdés valóban egy kicsit homályos. 2 különböző kérdést kever, és ez véleményem szerint zavarhoz vezet.

    1. Egy objektum helyes törléséhez a fordítónak ismernie kell annak típusát. A void* típusa nem ismert (pontosan ez a lényege a void* használatának a tényleges típus elrejtésére). Tehát a törlés nem hajtható végre ilyen objektumon a megfelelő tényleges típusba öntés nélkül.
    2. A void* használata általában azt jelenti, hogy a hegyes objektum tulajdonjoga tervezett valamilyen külső entitásé, nem pedig a mutatót tartalmazó entitásé. Az entitáson belül a mutató átlátszatlan, és egy külső objektum kezelőjeként szolgál, amely az entitás szempontjából egy fekete doboz. A Stack osztálynak tisztában kell lennie a felelősségek megosztásával, és nem szabad megkísérelnie megsemmisíteni az void* objektumot, mivel fogalma sincs az élettartamáról (ez például a veremváltozó felszabadítására vezet), sem a végrehajtandó műveletekről. megsemmisítésekor (működési hibához vezet).
    08.04.2013
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..