簡體   English   中英

關於C ++中的析構函數

[英]About destructors in c++

in destructor? 問題是如何正確刪除析構函數中的

class A{
private:
    char *name;
public:
    A(char *n) : name(n) {}
    ~A(){
        //???
    }
}

int main(){
    A *a = new A("name");
    delete a;
    return 0;
}

鑒於您不更改構造函數,因此正確的方法是不刪除任何內容。 字符串的所有權屬於客戶端,因為您沒有創建副本。

但是,重寫此方法的正確方法是讓構造函數使用new[]分配字符串的副本,並讓析構函數使用delete[]對其進行取消分配。

真正正確的方法是讓std::string做整個事情給你,而不是寫一個明確的析構函數都:

#include <string>

class A{
private:
   std::string name;
public:
    A(std::string n) : name(std::move(n)) {}
};

順便說一下,這使您不必擔心“三定律”,這意味着您不必費心編寫副本構造函數,移動構造函數,副本賦值運算符,移動賦值運算符,析構函數等等。

不允許刪除指向字符串常量"name"的指針。

由於您的類不擁有任何對象或內存塊,因此不應刪除任何內容。

在此示例中,您不需要刪除名稱。 “名稱”只是指向可執行映像中某個位置的指針,而不是用new / malloc / something_else分配的內存。

“名稱”占用編譯器自動保留的靜態內存。 如果刪除該內存,則行為是不確定的(即崩潰)。 首先,您僅“刪除”您“新”的內存。

最簡單的方法是使用適當的C ++( std::string )並避免使用裸露的指針,因為這樣可以簡化資源管理。

接口的問題是類型A聲明了參數的所有權,但是您不能聲明字符串文字的所有權,因為字符串文字是由實現管理的。 您可以繼續嘗試確定調用方是否應該創建深層副本並將其傳遞給A或者是否應該更改A設計以不嘗試聲明所有權並從中復制副本。 但是事實是,如果您只使用更高級別的結構,事情就會簡單得多:

class A {
   std::string name;
public:
   A(const std::string& name) : name(name) {}
};

無需手動復制數據,不需要析構函數或復制構造函數...所有這些都可以直接使用。

暫無
暫無

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

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