Verwijderen in C ++

struct item   
{ 
  unsigned int a, b, c;
};

item* items[10];    
delete items[5];    
items[5] = NULL;

De bovenstaande code werkt

Maar de onderstaande methode werkt niet

int * arr1[30];

delete (arr1+5);

Ik ben een beginner, vertel me alsjeblieft waarom ik kan verwijderen in het geval van een structuuraanwijzer, maar niet in het geval van int wijzer

2

3 antwoord

U begrijpt ogenschijnlijk niet waar delete voor is: het is puur en eenvoudig om geheugen toegewezen door nieuw vrij te geven, niet om elementen van arrays te 'verwijderen'.

Dus je zou het zo kunnen gebruiken:

int *p = new int;
//...
delete p;

Wanneer u arrays toewijst, moet u in plaats daarvan delete [] gebruiken, zoals dit:

int *q = new int[23];
//...
delete [] q;

Maar op geen enkel moment zou u moeten proberen verwijderen iets dat niet nieuw 'ed was, of gebruik de niet-overeenkomende versie van verwijderen , bv verwijder [] p; of verwijder q; hierboven.

Als wat je echt wilt een soort 'array' is waaruit je elementen kunt verwijderen, probeer dan dit:

#include 

struct item
{
    unsigned int a, b, c;
};

int main()
{
    std::vector items(10);
    items[5].a = 23;
    items.erase(items.begin() + 5);
    return 0;
}
13
toegevoegd
Ik denk dat het 'snelste vinger in het westen' wordt genoemd;)
toegevoegd de auteur Stuart Golodetz, de bron
je hebt me erin geslagen :))
toegevoegd de auteur johnathon, de bron
LOL, je hebt sowieso een +1 van me gekregen, goed gedaan
toegevoegd de auteur johnathon, de bron

Ken je overal het heap-geheugen toe? U doet dit niet in de bovenstaande code. Je hebt geluk dat de eerste delete niet crasht.

3
toegevoegd

Wanneer u de (arrl + 5) -benadering gebruikt, geeft u het geheugenadres van de array-slot zelf door bij index 5, niet door de int * die de sleuf bevat. Om delete de int * die zich in de sleuf bevindt in index 5, moet u de pointerwaarde dereferen, bijvoorbeeld:

delete *(arr1+5);
0
toegevoegd