Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VC++中无效删除_C++_Class_Object_Valgrind - Fatal编程技术网

VC++中无效删除

VC++中无效删除,c++,class,object,valgrind,C++,Class,Object,Valgrind,我有一个低级模板类,另一个类包含指向该类实例的指针。代码编译正确,但在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 /h

我有一个低级模板类,另一个类包含指向该类实例的指针。代码编译正确,但在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)
您可以在下面找到类文件,请注意,我已经删除了与内存分配无关的代码

下面是列表类:

#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
以下是Obj3类:

#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
最后,主要方法是:

#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);
}
执行整个程序,然后遇到错误。

您应该使用delete[],因为您将new[]用于int\u数组:

顺便说一句:你现在做的是UB$5.3.5/2删除我强调的[expr.Delete]:

在第一个可选删除对象中,的操作数的值 delete可以是空指针值,也可以是指向非数组对象的指针 由以前的新表达式或指向子对象的指针创建 1.8表示此类对象的基类第10条。如果没有,, 该行为未定义


错误消息为您提供了线索:如果您创建了一个数组,您将使用以下命令删除它:

delete[] int_array;
您目前拥有的:

delete int_array;
将只删除指向数组头的指针

delete int_array;