![](/img/trans.png)
[英]Do i need to delete objects that i set in class member when i replace them?
[英]When do I need to delete pointers, and when do I need to set them to 0?
我是一名 CS 學生,正在學習 C++。
這是一個普遍的問題,但我正在使用的特定示例是創建一個鏈表,該鏈表將具有存儲字符串指針的節點。
class LinkNode {
public:
friend class Stack;
LinkNode* next;
std::string* data;
LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; }
}
如果我使用指針,那么我不應該有一個析構函數在next
和data
上調用delete
嗎?
~LinkNode() {
delete this->data;
delete this->next;
}
我的教材中使用的代碼以及互聯網上的示例都忽略了包含這一點(即使我們確實在其他上下文中使用了析構函數)。 我試圖理解為什么在這種情況下不需要這樣做。
而且,相當相關:如果我使用指針來刪除某些東西,我是否必須將指針設置為 null?
我經常看到人們這樣寫刪除:
delete ptr;
ptr = 0;
據我了解,將其設置為 0 的目的只是為了防止它被意外使用,因為delete
后它現在指向一個無效的 memory 地址。
因此,如果我在 function 的末尾調用delete
,其中指針將掉出 scope 無論如何,就像在彈出 function 或析構函數中一樣,可以刪除該行嗎? 人們只是出於習慣而包含它嗎?
delete
指向有效對象/變量的指針以銷毀它們並釋放空間。NULL
、 nullptr
或0
(完全相同),以便您可以將它們識別為未使用。 你看,如果你只是delete
object,指針本身不會改變,所以現在它指向了memory的無效空間。 如果您再也不會使用該指針,那么這沒什么大不了的,否則可能會很成問題。
因此,將其設置為null
允許您對指針執行檢查並確定您的指針是否正在使用。
此外,作為您的第一個問題,正如評論中指出的那樣,您必須在使用new
創建的指針上調用delete
。
data
指針指向在列表之外創建的字符串(因此它的行為類似於引用列表)。 在這種情況下,該指針不負責管理其內容並且不應被刪除。data = new string("whatever");
,那么是的,你應該在析構函數中刪除它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.