gpt4 book ai didi

c++ - 试图删除指向派生对象的基指针的断言错误

转载 作者:行者123 更新时间:2023-11-28 01:30:08 25 4
gpt4 key购买 nike

在研究 C++ 中的继承时,我了解到用于多态行为的基类应该将其析构函数实现为 virtual

我以为我明白如何很好地应用它,但我遇到了一个我不明白的小问题。

给定以下代码:

#include <iostream>

struct Base
{
Base() { std::cout << "Base ctor called\n"; };
virtual ~Base() { std::cout << "Base dtor called\n"; };
};

struct Derived : Base
{
Derived() : Base() { std::cout << "Derived ctor called\n"; }
~Derived() { std::cout << "Derived dtor called\n"; };
};

int main()
{
Derived d;
Base *p_base = &d;

delete p_base; //Problem here?

return 0;
}

输出符合预期:

Base ctor called
Derived ctor called
Derived dtor called
Base dtor called

但是,发生了 _CrtisValidHeapPointer(block) 断言错误。

如果 p_base 直接指向一个新的 Derived 对象,即 Base *p_base = new Derived();

,一切正常

这里有什么不同?

亲切的问候

最佳答案

问题是您的本地构造对象 d 将在其范围末尾自动删除,在您的情况下,当 return 0 被调用时。但是那时,您已经删除了指向同一对象的 p_base 。因此对象被删除了两次。

您的问题与继承无关。它甚至应该出现在同一类的对象中。

关于c++ - 试图删除指向派生对象的基指针的断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51867254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com