[英]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.