C++ delete this

前言

本篇基於“delete this” in C++,並完善了原文中提供的幾個例子。

can only be used with new

只有當物件是使用new創建的,我們才能使用delete this來銷毀它。

定義一個名為A的類別,函數fun裡用到了delete this

class A{
public:
    void fun(){
        delete this;
    }
};

使用new創建一個A類別的物件,並使ptr1指向它。然後呼叫fun這個函數,用來銷毀該物件:

A *ptr1 = new A;
ptr1->fun();
ptr1 = nullptr; // make ptr NULL to make sure that things are not accessed using ptr.

以上這段代碼可以執行無誤。

再來看一個例子,如果沒有用new創建物件,卻使用了delete this

A a;
a.fun();

則會造成以下錯誤:

a.out(24779,0x1164e25c0) malloc: *** error for object 0x7ffee89ff718: pointer being freed was not allocated
a.out(24779,0x1164e25c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6

access member variable after delete this

在使用delete this後,存取成員變數是undefined behavior。

下面定義了一個名為B的類別。在建構子中會初始化它的三個成員變數。而在函數fun中,則會在delete this前後各輸出一次它的三個成員變數:

class B{
private:
    int x;
    std::string s;
    std::vector<int> v;
public:
    B(){
        x = 100;
        s = "abc";
        v.push_back(x);
    }
   
    void fun(){
        std::cout << "before delete this" << std::endl;
        std::cout << x << std::endl;
        std::cout << s << std::endl;
        std::cout << v.size() << " " << v[0] << std::endl;
    
        delete this;

        /* Invalid: Undefined Behavior */
        std::cout << "after delete this" << std::endl;
        std::cout << x << std::endl;
        std::cout << s << std::endl;
        std::cout << v.size() << " " << v[0] << std::endl;
    }
};

使用正確地方式來新建及銷毀B類別的物件:

B *ptr2 = new B;
ptr2->fun();
ptr2 = nullptr;

輸出為:

before delete this
100
abc
1 100
after delete this
100
abc
0 0

因為在delete this後存取成員變數是未定義的行為,所以我們可以看到,成員變數vdelete this前後並不一致。

以上兩個例子的代碼詳見cpp-code-snippets/delete_this.cpp

參考連結

“delete this” in C++

cpp-code-snippets/delete_this.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值