在Visual Studio 2015中,下面显示的代码在foo()的出口处崩溃,并显示以下错误消息:HEAP [NameOfExecutable.exe]:为RtlValidateHeap指定的地址无效(00520000,005332D4)
注意:
当我从B :: bob()中删除“virtual”关键字时,程序运行正常。
当使用“g ++ -std = c ++ 11”进行编译时,程序可以从命令行(Visual Studio外部)正确运行。
在push_back()中使用std :: move()并没有改变输出。
#include <vector>
#include <memory>
#include <iostream>
class A
{
int a;
};
class B : public A
{
int b;
virtual void bob() { };
};
void foo()
{
std::vector<std::unique_ptr<A>> test;
test.push_back(std::unique_ptr<B>(new B));
}
int main()
{
foo();
std::cout << "Reached the end\n";
std::cin.get();
}
我做错了什么?谢谢你的帮助!
答案 0 :(得分:0)
如果您调试代码,您会注意到foo()
的退出点出现异常 - 当调用test
的析构函数时。
std::vector
和std::unique_ptr
当然都会管理它们的内存,所以此时此处的B
对象将会被销毁。
这里的问题是你用A
指针存储它,所以将调用A
类析构函数。
要解决这个问题,只需将公共虚拟析构函数引入“A”:
class A
{
int a;
public:
virtual ~A() {}
};