+ Odpowiedz na ten temat
Pokaż wyniki od 1 do 3 z 3

Temat: dealokacja pamieci c++

  1. #1

    Dołączył
    Mar 2008
    Postów
    31

    dealokacja pamieci c++

    Witam.

    Mam problem z dealokacja pamieci. Dostaje blad:
    Kod:
    lab2(1674) malloc: *** error for object 0x1cd6: Non-aligned pointer being freed
    *** set a breakpoint in malloc_error_break to debug
    Juz od jakiegos czasu sie z tym mecze i nie moge znalezc nigdzie rozwiazania. Uzywam Xcode 3.1.3.
    Ostatnio edytowane przez raver ; 04.03.2010 o 14:27
    WykopShare on FacebookBlipTwitter
    Cytuj Cytuj  

    • Serwis Cortland

  2. #2
    Avatar macieks72
    Dołączył
    Aug 2009
    Postów
    3,828
    w zakomentowanych liniach masz problem:

    Kod:
    Card::Card(char author[], char title[], int year, int quantity)
    {
        this->author = new char[strlen(author)];
    	//this->author = author;
    	this->title = new char[strlen(title)];
    	//this->title = title;
    	this->year = year;
    	this->quantity = quantity;
    }
    Więcej nie pomogę bo c++ bawiłem się 10lat temu i mi dużo wyleciało z głowy.
    Ostatnio edytowane przez macieks72 ; 04.03.2010 o 14:16
    WykopShare on FacebookBlipTwitter
    Cytuj Cytuj  

  3. #3
    Avatar Krzema
    Dołączył
    Jul 2008
    Postów
    91
    Na początek zmieniłbym nazwę "author" składnika klasy "Card" albo nazwę argumentu konstruktora - szczerze mówiąc nie wiem który obiekt kompilator sobie wybierze jeżeli w ciele konstruktora powiesz mu "author"... Pewnie w wyrażeniu typu

    Kod:
    this->author= author;
    kompilator Cię zrozumie i będzie wiedział, że "author" bez "this" to argument, ale ja jednak bym dla czystej wygody i pewności rozróżnił te nazwy. To samo odnosi się do wszystkich argumentów konstruktora. Na potrzeby tego postu załóżmy, że w argumencie konstruktora zastosujesz "authorArg".

    Druga rzecz: w operatorze new podajesz złą wielkość dla bufora. Funkcja strlen zwraca Ci długość stringu bez bajtu zerowego (który kończy każdy C-string). Musisz więc dodać przynajmniej 1 do tej wielkości, jeżeli chcesz koniecznie zrobić to w ten sposób. W przeciwnym wypadku bajt zerowy się "nie zmieści".


    Dalej:
    Kod:
    this->author = authorArg;
    Takie coś jest niedopuszczalne. this->author jest wskaźnikiem, a do wskaźników niestety nie możesz sobie ot tak przypisać stringu. Musisz skorzystać z funkcji, która skopiuje pamięć, np. memcpy():

    Kod:
    memcpy(this->author, authorArg, strlen(authorArg)+1);
    strcpy() byłoby nawet wygodniejsze bo nie musisz podawać tego trzeciego argumentu - ta funkcja kopiuje string aż napotka bajt zerowy.

    Jeśli dałbyś pełen kod (jeśli to możliwe), byłoby o wiele łatwiej.
    Ostatnio edytowane przez Krzema ; 06.03.2010 o 23:09
    WykopShare on FacebookBlipTwitter
    Cytuj Cytuj  

+ Odpowiedz na ten temat