我有一个函数a(),它调用另一个函数b(),其中在堆上分配特定类的对象向量并返回其指针。现在退出func a()我的程序。崩溃与堆损坏错误。调试器显示它在free func中崩溃了。我怎样才能知道哪个对象被调用的析构函数?
使用调试器我可以看到调用void __cdecl _free_base(void * pBlock),pblock的值是0x00000000646ec420 class std :: basic_ostream< char,struct std :: char_traits> std :: cout void *
这是什么意思
答案 0 :(得分:1)
来自MSDN:
当一个对象超出范围或被删除时,其完全销毁的事件序列如下:
调用类的析构函数,并执行析构函数体。
非静态成员对象的析构函数按它们在类声明中出现的相反顺序调用。用于构造这些成员的可选成员初始化列表不会影响(构造或)销毁的顺序。 (有关初始化成员的更多信息,请参阅初始化基础和成员。)
非虚拟基类的析构函数按声明的相反顺序调用。
虚拟基类的析构函数按声明的相反顺序调用。
尝试添加一些断点以查看哪个析构函数导致堆损坏错误。