簡體   English   中英

如何在C ++中刪除對象?

[英]How to delete an object in C++?

即使在使用unique_ptr之后,構造函數和析構函數調用也不匹配。 有沒有辦法讓構造函數和析構函數調用匹配否則會有內存泄漏。

#include <iostream>
using namespace std;
class P 
{
    public:
    P() { cout<<"P()\n"; }
    virtual ~P() { cout<<"~P()\n"; }
};
class D: public P
{
    P *q;
    public:
    D(P *p):q(p) { cout<<"D()\n"; }
    ~D()  { cout<<"~D()\n"; }
};
class A: public D
{
    public:
    A(P *p):D(p) { cout<<"A()\n"; }
    ~A() { cout<<"~A()\n"; }
};
class B: public D
{
    public:
    B(P *p):D(p) { cout<<"B()\n"; }
    ~B()  {  cout<<"~B()\n"; }
};
int main()
{
    P *p = new B(new A(new P()));
    delete p;
    return 0;

}

OUTPUT:
P()
P()
D()
A()
P()
D()
B()
~B()
~D()
~P()

你永遠不會釋放傳遞給你的對象的指針,因此永遠不會調用它們的析構函數。

您需要刪除析構函數中的指針,以確保也調用存儲對象的析構函數:

class D: public P
{
    P *q;
public:
    D(P *p) : q(p) { cout << "D()" << endl; }
    ~D() { delete q; cout << "~D()" << endl; }
};

您還必須修改您的復制構造函數(參見Rule of Three )。 在這種情況下,這是有問題的,因為您要么必須復制指針值,要么讓兩個實例指向同一個對象。 在后一種情況下,您必須注意不要兩次刪除指針。

但是,這就是C ++智能指針的用武之地。 一種更簡單的方法是:

class D : public P
{
    unique_ptr<P> q;
public:
    D(P *p) : q(p) {} 
};

這樣您就不必跟蹤指針,也不必覆蓋任何復制構造函數等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM