c++ - *** 检测到 glibc *** ./parent_child_conscall : double free or corruption (fasttop): 0x09d9e028 ***

标签 c++

我的代码包含两个类。

  class points{
            char *p;
    public: points(){cout<<"constructor points called"<<endl;p=new char();}
            virtual ~points(){cout<<"destructor points called"<<endl;delete(p);}
  };
  class otherpoints: public points{
                    points x1;
    public: otherpoints(){cout<<"constructor otherpoints called"<<endl;x1=points();}
            ~otherpoints(){cout<<"destructor otherpoints called"<<endl;}
  };
  int main(int argc, char *argv[])
  {
    otherpoints y1;

    return 0;
  }

这里我在基类构造函数中分配了一个指针,并在各自的基类析构函数中销毁了指针的内存。

当我使用 valgrind 运行二进制文件时,出现错误:-

constructor points called

constructor points called

constructor otherpoints called

constructor points called

destructor points called

destructor otherpoints called

destructor points called

==2209== Invalid free() / delete / delete[]

==2209==    at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)

==2209==    by 0x8048A36: points::~points() (in home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x8048BB2: otherpoints::~otherpoints() (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x804889A: main (in /home/santosh/programs/c++/parent_child_conscall)

==2209==  Address 0x42d5098 is 0 bytes inside a block of size 1 free'd

==2209==    at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)

==2209==    by 0x8048A36: points::~points() (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x8048B32: otherpoints::otherpoints() (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x8048889: main (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    destructor points called

==2209== 

==2209== HEAP SUMMARY:

==2209==     in use at exit: 1 bytes in 1 blocks

==2209==   total heap usage: 3 allocs, 3 frees, 3 bytes allocated

==2209== 

==2209== LEAK SUMMARY:

==2209==    definitely lost: 1 bytes in 1 blocks

==2209==    indirectly lost: 0 bytes in 0 blocks

==2209==      possibly lost: 0 bytes in 0 blocks

==2209==    still reachable: 0 bytes in 0 blocks

==2209==         suppressed: 0 bytes in 0 blocks

==2209== Rerun with --leak-check=full to see details of leaked memory

==2209== 

==2209== For counts of detected and suppressed errors, rerun with: -v

==2209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 18 from 7)

无法知道我无法释放哪个 1 字节内存。

我必须发布回溯报告吗?

感谢任何帮助。

最佳答案

这里的问题是您创建了 points 类的两个实例。一个带有 points() 的临时值,当然还有一个带有 x1 的声明。

当您执行 x1 = points() 时,您使用 points() 构造创建一个临时对象,然后将其复制分配给 x1,然后临时对象被销毁。由于您没有提供复制赋值运算符,编译器将为您创建一个,但它只是复制指针,而不分配新内存。这意味着你有一段时间有两个包含指向同一内存的指针的对象。当临时对象被销毁时,您释放析构函数中的内存,使 x1 中的指针悬空。当 x1 被销毁时,您尝试删除这个悬挂指针,导致双重释放错误。

解决此问题的最佳方法是实现复制赋值运算符,最好是复制构造函数,并在其中分配新内存并复制数据。

关于c++ - *** 检测到 glibc *** ./parent_child_conscall : double free or corruption (fasttop): 0x09d9e028 ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465048/

相关文章:

c++ - 错误 C2039 : 'result_type' : is not a member of '` global namespace''

c++ - map - 找到最近的值?

C++ fstream 继续读取相同的前 5 行?

c++ - 构造函数 : Why does 'explicit' prevent assignment construction?

C++ 函数指针与子类

c++如何编写编译器可以轻松针对SIMD优化的代码?

c++ - 使用函数调用更改数组的值

c++ - C++模板方法定义在类中不匹配

c++ - 使用 C++ (VS 2010) FAST 将 BMP 保存为 PNG

c++ - 这是分配非常量数组的合法举动吗?