【问题标题】:C++ - Invalid delete from valgrindC++ - 从 valgrind 中删除无效
【发布时间】:2016-03-29 02:51:30
【问题描述】:

我有一个低级模板类和另一个包含指向此类实例的指针的类。代码编译正确,但通过 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)

您可以在下面找到类文件,请注意我已经删除了与内存分配无关的代码。

这是 List 类:

#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

最后是main方法:

#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);
}

整个程序执行,然后遇到错误。

【问题讨论】:

    标签: c++ class object valgrind


    【解决方案1】:

    您应该使用delete[],因为您将new[] 用于int_array

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

    顺便说一句:你正在做的是 UB。 $5.3.5/2 删除 [expr.delete](我强调):

    在第一种选择(删除对象)中,操作数的值 delete 可能是一个空指针值,一个指向非数组对象的指针 由先前的 new 表达式或指向子对象的指针创建 (1.8) 表示此类对象的基类(第 10 条)。如果不, 行为未定义

    【讨论】:

      【解决方案2】:

      错误信息给了你线索:如果你创建了一个数组,你删除它:

      delete[] int_array;
      

      你目前拥有的:

      delete int_array;
      

      只会删除指向数组头部的指针。

      【讨论】:

        猜你喜欢
        • 2013-11-28
        • 1970-01-01
        • 2017-04-08
        • 2011-04-19
        • 2016-03-16
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多