Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Brak mozliwości zwolnienia pamięci właściwości w obiekcie

Ostatnio zmodyfikowano 2014-12-30 20:12
Autor Wiadomość
macsurf
Temat założony przez niniejszego użytkownika
[C++] Brak mozliwości zwolnienia pamięci właściwości w obiekcie
» 2014-12-30 18:53:14
Witam

Niestety mam problem ze zwolnieniem pamięci jednej z wlaściwosci ostatniego zwalnianego obiektu. Wszystkie obiekty są tego samego typu. Ale tylko ostatni z nich nie jest w stanie zwolnić pamięci dla właściwości p typu int. Dla tablicy char właściwości txt nie ma problemów tylko z tym intem :/

Po uruchomieniu programu mam taką informację:

a.out(615) malloc: *** error for object 0x7fff67614b04: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6



Przykładowy kod:

C/C++
#include <iostream>
#include <string.h>

using namespace std;


// DEKLARACJA KLASY //

class MyTest
{
   
private:
    static int numobj;
   
public:
   
    // WLASCIWOSCI
    int x;
    int * p;
    char * txt;
   
    // METODY
    void print() {
        cout << "x: " << x << " p: " << p << " txt: " << txt << endl;
    }
   
    void setTxt( const char * cstr );
   
    // NIEJAWNE
    MyTest & operator =( const MyTest & o ); // operator przpisania ( przeciazenie )
    MyTest(); // konstruktor
    MyTest( const MyTest & o ); // konstruktor kopiujacy ( const opcjonalnie )
    ~MyTest(); // destruktor
   
};





// MAIN CODE //

int main() {
   
   
    system( "clear" );
   
    // DEKLARACJE ZMIENNYCH
    MyTest obj;
    MyTest obj2;
    MyTest obj3 = obj2;
    int num = 26;
   
   
    // CODE
   
    obj.x = 5;
    obj.p = & num;
    obj.setTxt( "moj tekscik !" );
   
    // kopiowanie obiektu ( wywolywany operator przypisania )
    obj2 = obj;
    // kopiowanie obiektu ( wywolano konstruktor kopiujacy i przypisania )
    obj3 = MyTest( obj );
    // drukowanie wlasciwosci obiektow
    obj.print();
    obj2.print();
    obj3.print();
   
   
   
    return 0;
}



// METODY KLASY //


// KONSTRUKTOR DOMYSLNY //

int MyTest::numobj = 0; // inicjalizacja zmiennej statycznej !

MyTest::MyTest() {
   
    cout << "TWORZE OBIEKT !" << endl;
    cout << "Wywolany konstruktor domyslny klasy: " << typeid( this ).name() << endl;
    cout << "Obiekt utworzony pod adresem: " << this << endl;
    cout << "Licznik obiektu: " << ++numobj << endl << endl;
   
    x = 99;
    p = new int( 1 );
    txt = new char[ 64 ];
   
}

// KONSTRUKTOR KOPIUJACY //

MyTest::MyTest( const MyTest & o ) {
   
    cout << "Konstruktor kopiujacy !" << endl;
    cout << "Obiekt: " << this << endl;
    cout << "Licznik obiektu: " << ++numobj << endl << endl;
   
    // zwykle kopiowanie wartosci
    x = o.x;
   
    // kopiowanie wartosc wskazywanych przez wskazniki
    p = new int( * o.p );
    txt = new char[ 64 ];
    setTxt( o.txt );
}

// OPERATOR PRZYPISANIA //

MyTest & MyTest::operator =( const MyTest & o ) {
   
    cout << "Operator przypisania !" << endl;
    cout << "Kopiowanie wlasciwosci - glebokie ! / Obiekt: " << this << endl << endl;
   
    if( this == & o )
         return * this;
   
   
    // zwalniamy pamiec do wskaznikow ze starymi danymi
    delete p;
    delete[] txt;
   
    x = o.x;
    p = new int( * o.p );
    txt = new char[ 64 ];
    setTxt( o.txt );
   
    return * this;
}


// METODY JAWNE //

void MyTest::setTxt( const char * cstr ) {
    strcpy( txt, cstr );
}


// DESTRUKTOR //

MyTest::~MyTest() {
   
   
    cout << "Destruktor obiektu:  " << this << " Niszcze obiekt nr: " << numobj << endl << endl;
    --numobj;
   
    cout << "txt w destrktorze: " << txt << " | " << & txt << endl;
    cout << "p: " << * p << " | " << p << endl << endl;
   
    delete[] txt;
    delete p;
}
P-123683
DejaVu
» 2014-12-30 19:52:08
C/C++
obj.p = & num;
Wywal tą linijkę lub zamień na:
C/C++
* obj.p = num;
P-123697
macsurf
Temat założony przez niniejszego użytkownika
» 2014-12-30 20:12:51
Dzięki, teraz jest ok :)
Ehh takie błędy bywają irytujące a wręcz upokarzające :)
Jak miałem zwolnić pamięć skoro przypisałem adres zmiennej ze stosu ehh nadpisując wcześniej przydzielony adres pamięci na stercie LOL :)



P-123700
« 1 »
  Strona 1 z 1