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.