为什么不能class在多态C++中被破坏

Why can't class be destructed in polymorphism C++

我在使用多态性时遇到问题。 代码在这里:

class A {
public:
    A() {cout << "construct a" << endl;}
    virtual ~A() {cout << "destroy a" << endl;}
};

class B : public A{
public:
    B() {cout << "construct b" << endl;}
    ~B() {cout << "destroy b" << endl;}
};
void main() {
    A *p = new B;
}

结果是:

construct a
construct b

为什么'p'不能被销毁或者我哪里错了。谢谢

您需要调用

delete p;

删除指针并调用析构函数。动态分配的对象不会自动调用其析构函数,这就是为什么您需要调用 delete 运算符,它首先调用析构函数然后调用 operator delete 释放内存。

因为您正在使用 new 运算符分配数据。如果要调用析构函数,请确保使用

删除指针
delete p;

您也可以将 p 声明为 std::unqiue_ptr<A> p(new B); - 唯一指针将删除范围末尾的指针。

通过使用普通指针,您已经说过要自己管理对象的生命周期。由于您从未说过要销毁该对象(delete p; 会这样做,只要 p 指向该对象),它就不会被销毁。

通常,您应该自动管理对象的生命周期。两个基本工具是:

std::unique_ptr<A> p { new B };

使用 unique_ptr,只允许一个指针指向 "own" 对象。当this指针消失后,它指向的对象会自动销毁。另一个工具是

std::shared_ptr<A> p { new B };
// or p = make_shared<B>();

多个共享指针可以"share"对象的所有权。当所有共享指针都消失时,对象将自动销毁。

调用 new 在堆上分配内存。您需要使用 delete 运算符显式释放此内存。否则会导致可怕的内存泄漏。由于这是错误的常见来源,您可能对使用 std::unique_ptr boost::scoped_ptr

感兴趣