2016-03-29 2 views
2

Ich habe eine Template-Klasse niedriger Ebene und eine andere Klasse, die einen Zeiger auf eine Instanz dieser Klasse enthält. Der Code kompiliert korrekt, aber ich laufe in den folgenden Fehler, wenn es durch valgrind ausgeführt wird:C++ - Ungültiges Löschen von Valgrind

==2642== Invalid free()/delete/delete[]/realloc() 
==2642== at 0x4C2A360: operator delete(void*) (vg_replace_malloc.c:507) 
==2642== by 0x4125B4: List<std::string>::~List() (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x411CB0: Obj3::~Obj3() (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x410AC1: main (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== Address 0x5a02878 is 8 bytes inside a block of size 88 alloc'd 
==2642== at 0x4C298A0: operator new[](unsigned long) (vg_replace_malloc.c:389) 
==2642== by 0x4124FE: List<std::string>::List() (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x411BC6: Obj3::Obj3(std::string, std::string, std::string, std::string, std::string) (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 
==2642== by 0x41065A: main (in /home/alex/Documents/Documents/cpp/object_module/obj_test) 

Sie können die Klassendateien unten finden, beachten Sie bitte, dass ich aus gestrippt habe Code nicht relevant für Speicherbelegung.

Hier ist die Liste Klasse:

#ifndef LIST_H 
#define LIST_H 

template <class T> 
class List 
{ 
    T *int_array; 
    ... 
    public: 
    List() {int_array=new T[10];} 
    ~List() {delete int_array;} 
    ... 
}; 
#endif 

Hier ist die obj3 Klasse:

#ifndef OBJ3_H 
#define OBJ3_H 

#include <string> 
#include "list.h" 

class Obj3 
{ 
    private: 
     //A list of scenes 
     List <std::string> *scene_list; 
     ... 
    public: 
      //Constructors & Destructor 
      Obj3() {scene_list = new List <std::string>;} 
      ~Obj3() {delete scene_list;} 
      ... 
#endif 

Und schließlich die wichtigste Methode:

#include "obj3.h" 

void print_obj_attributes(Obj3& obj) 
{ 
std::cout << obj.get_name() << std::endl; 
... 
} 

int main() 
{ 
Obj3 obj2; 
std::cout << "Object 2" << std::endl; 
print_obj_attributes(obj2); 
} 

Das gesamte Programm ausführt, und dann Der Fehler ist aufgetreten.

Antwort

4

sollten Sie delete[] verwenden, da Sie new[] für int_array verwendet:

... 
public: 
    List() {int_array=new T[10];} 
    ~List() {delete[] int_array;} 
       ~~ 
... 

BTW: Was Sie tun UB ist. $ 5.3.5/2 Löschen [expr.delete] (hervorgehoben von mir):

Bei der ersten Alternative (löscht Objekt), um den Wert des Operanden von löschen kann einen Null-Zeiger-Wert sein, ein Zeiger auf ein Nicht-Array-Objekt , das durch einen vorherigen new-Ausdruck erstellt wurde, oder ein Zeiger auf ein Unterobjekt (1.8), das eine Basisklasse eines solchen Objekts darstellt (Abschnitt 10). Wenn nicht, ist das Verhalten undefined.

0

Die Fehlermeldung Sie den Schlüssel schenkt: wenn Sie ein Array erstellen löschen Sie es mit:

delete[] int_array; 

Was Sie derzeit haben:

delete int_array; 

Wird der Zeiger nur löschen an den Kopf des Arrays.