Visual Studio:子类崩溃的唯一指针向量

时间:2016-10-14 18:30:10

标签: visual-studio c++11

在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(); }

我做错了什么?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果您调试代码,您会注意到foo()的退出点出现异常 - 当调用test的析构函数时。

std::vectorstd::unique_ptr当然都会管理它们的内存,所以此时此处的B对象将会被销毁。

这里的问题是你用A指针存储它,所以将调用A类析构函数。

要解决这个问题,只需将公共虚拟析构函数引入“A”:

class A
{
    int a;
public:
    virtual ~A() {}
};