为什么不能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
感兴趣
我在使用多态性时遇到问题。 代码在这里:
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