Keresés

Új hozzászólás Aktív témák

  • ArchElf

    addikt

    válasz h1ght3chzor #1524 üzenetére

    Amit kiókumláltam (hiányos c++ tudásommal):
    Project* temp1 = new Project [getprojektmeret()];
    for(int i=0;i<getprojektmeret();++i){
    temp1[i]=this->tomb[i];
    }
    delete[] this->tomb;
    this->tomb = new Project[getprojektmeret()+1];
    int k=0;
    for(k=0;k<getprojektmeret();++k){
    this->tomb[k]=temp1[k];
    }
    this->tomb[k]=a;
    delete[] temp1;

    A második sorban referencia szerint másolod át az osztályokat, így hiába másoltad át, ha a referencia a temp1-ben ugyanoda mutat, mint a tomb-ben.
    Miután az 5. sorban delete-tel kitörlöd a tömböt látszólag törlődik a temp1 tömb tartalma is, hiszen a delete igazából nem (csak?) a hivatkozás tömböt törli, hanem a mögötte álló tartalmat is. A következő sorbancsinálsz egy új tömböt az elemeidnek, de azok már valójában törlődtek az előző sorban, hiába másolod át a for ciklusban, már nem lesznek valid elemek (príma érvénytelen hivatkozásokat sikerül így generálnod. A második delete meg valószínűleg azért hal meg, mert már eleve érvénytelen hivatkozások vannak a tömbben.

    Alapvetően az alábbi lehetőségeid vannak:
    - ne töröld az elemeket delete-el (se az elején se a végén), csak nullázd ki a tömbböt, az új elemet add hozzá egyszerűen (lehet, hogy memory leak-et okoz - bár jobban belegondolva taláűn nem is)
    - nem kell a sok másolgatós mizéria, csinálj neki egy új tömböt a régit meg dobd el (kb ugyanaz mint az előző, kevesebb másolással), korábban már írtam hogyan
    - add át érték szerint az elemeket - kell hozzá egy Project(const Project& p) konstruktor, amivel másolni tudod az elemeket. Bonyolultabb (illetve volatilis) osztályok esetén nem igazán működik, de ha mindenképp szeretnéd használni a delete-et akkor ide jó lesz.

    AE

  • proci985

    MODERÁTOR

    válasz h1ght3chzor #1524 üzenetére

    teljes kód nem kell, pl egy tömb típusa, még az a is elég szvsz.

    tipp: szeparáld a tárolóclasst a projecttől, és teszteld pl egy célra létrehozott classal külön. szerintem egyszerűbb lenne, hacsak nem valami minimálprojektről van szó, ahol nem éri meg mindent szétválasztani.

    "Egyébként stl tárolót, nem használhatok"
    beadandó? :DDD

    WonderCSabo: jogos, push_back pedig tényleg a legegyszerűbb:).

    Mindent van értelme dinamikusan kezelni, sokszor jól jöhet (bár nyilván ilyen kicsi feladatnál nem sok értelme van).
    persze, de elnézve a kódot volt egy olyan sanda gyanúm, hogy itt valami egyéb követelmény is van a háttérben (tipikus c iskolapéldának tűnt)..

Új hozzászólás Aktív témák