PDA

Visualizza la versione completa : [C++] pointer being freed was not allocated


MaStErYuRi
07-07-2011, 01:57
Ho la seguente classe Esercizio (commerciale)



#ifndef ESER_H
#define ESER_H

#include <string>

class Esercizio
{
public:
//Constructors
Esercizio(const char * iva=" ", const char * comune=" ", int mtq=0) :

P_IVA(new char [strlen(iva)+1]),
Comune(new char [strlen(comune)+1]),
mq(mtq)
{
strcpy(P_IVA,iva);
strcpy(Comune,comune);
}

Esercizio(const Esercizio & E) :

P_IVA(new char [strlen(E.getP_IVA())+1]),
Comune(new char [strlen(E.getComune())+1]),
mq(E.getmq())

{
strcpy(P_IVA,E.getP_IVA());
strcpy(Comune,E.getComune());
}


//Distructor
~Esercizio();

//Getters
char * getComune() const {return Comune;}
char * getP_IVA() const {return P_IVA;}
int getmq() const {return mq;}

//Other functions
bool licenza(const int) const;
void VisualizzaDati() const;

protected:
char * P_IVA;
char * Comune;
int mq;
};

#endif


Purtroppo devo necessariamente gestire le variabili membro come char *, altrimenti avrei usato delle string.

Ad ogni modo, ho questa classe template:



#ifndef LIS_H
#define LIS_H

#include <iostream>

template <class E> class Lista;

template <class E>
class Record
{
friend class Lista<E>;
template <class U> friend std::ostream & operator << (std::ostream &, const Lista<U> &);

private:
E elem;
Record<E> * punt;
};

template <class E>
class Lista
{

private:
typedef Record<E> * L;
L l;
public:
Lista() : l(0) {}
~Lista();

bool empty() const {return (l==0);}
bool full() const {return false;}
void push(const E);
void top(E &) const;
void pop(E &);
void elimina(const E e) {eliminaric(l,e);}
void inserisci(const E e) {inserisciric(l,e);}
bool inlist(const E e) const {return inlistric(l,e);}

template <class U> friend std::ostream & operator << (std::ostream &, const Lista<U> &);


private:
void elimina_in_testa(L &);
void inserisciric(L &, const E);
void eliminaric(L &, const E);
bool inlistric(const L &, const E);
};

template <class E> Lista<E>::~Lista()
{
L p,q;
for (p=l; p!=0; p=q)
{
q=p->punt;
delete p;
}
}

template <class E> void Lista<E>::push(const E e)
{
L q = new Record<E>;
q->elem=e;
q->punt=l;
l=q;
}
#endif


Se dichiaro nel main un oggetto di tipo Lista<Esercizio> L, la compilazione avviene senza errori, ma in esecuzione il programma da il seguente errore:



MacBookPro:Esercizio Commerciale yuri$ ./yuri
yuri(1486) malloc: *** error for object 0x1001000c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap


Dai vari test che ho eseguito sono certo quasi al 100% che l'errore avviene in corrispondenza dell'assegnazione che ho evidenziato in rosso. (Nel corpo della funzione Lista<E>::push)

PS Se occorrono altri pezzi di codice chiedete pure, ho cercato stringere un po'.
Help! :(

oregon
07-07-2011, 02:45
Dov'è il distruttore di Esercizio?

P.S. Destructor non distructor ... :)

MaStErYuRi
07-07-2011, 02:59
Eccolo, è nel file Esercizio.cpp



//Destructor
Esercizio::~Esercizio()
{
delete [] P_IVA;
delete [] Comune;
}


PS grazie della correzione di lingua :P

oregon
07-07-2011, 03:12
Servirebbe anche un main che genera l'errore ...

MaStErYuRi
07-07-2011, 03:23
Eccolo



#include "Esercizio.h"
#include "Lista.h"
#include <iostream>

using namespace std;

int main()
{
Lista<Esercizio> L;
Esercizio E("asd","asd",32);
L.push(E);

return 0;
}


In realtà non dovrei usare la push nel main, ma la

void inserisci(const E e)
uso la push perché è richiamata da inserisci ed è quella che genera l'errore

MaStErYuRi
07-07-2011, 15:05
Mi da lo stesso errore anche con la classe Pila, quindi escluderei che sia un problema della struttura dati, anche perché è copiata pari passo da un libro.

oregon
07-07-2011, 17:57
Non ho avuto tempo di approfondire ma l'errore sembra verificarsi nel distruttore di Lista, in particolare nel delete all'interno del ciclo ...

Quando ho qualche minuto controllo meglio ... fallo anche tu ...

MaStErYuRi
07-07-2011, 18:19
Ok :confused:

MaStErYuRi
08-07-2011, 16:37
Sembra che se utilizzi std::string al posto di char * sia tutto a posto. Che enigma, eppure la gestione dell'allocazione e deallocazione mi sembra fatta bene...

MaStErYuRi
08-07-2011, 16:50
edit

Loading