![](/img/trans.png)
[英]Why do I have to call “delete” twice when I have each two pointers at same memory?
[英]Do I have to delete memory in this case?
這是一個使用動態內存的簡單程序。
我的問題是我是否必須刪除和上的內存,否則該結構將為我處理它?
#include <iostream>
struct Student {
int grade;
char *name;
};
void print(Student name);
int main() {
Student one;
one.grade = 34;
one.name = new char[12];
int i;
for (i = 0; i < 11; ++i) {
one.name[i] = 'a' + i;
}
one.name[i] = '\0';
print(one);
delete[] one.name;
return 0;
}
void print(Student name) {
std::cout << name.name << " has a score of " << name.grade << "\n";
}
有一條簡單的經驗法則:每次調用new
您都應該刪除一次。 在這種情況下,您應該像這樣刪除one.name:delete delete [] one.name
。
當然,在不再需要它的價值之后,您應該這樣做。 在這種情況下,這正好在返回之前。
使用delete
或free
完成使用new
或malloc
dynamically
分配的malloc
必須釋放它,否則會出現Memory leak
。
區分delete
和delete[]
:第一個不帶下標的運算符用於刪除為new分配的指針動態內存。 后者用於刪除動態分配的數組。
因此,在您的情況下:
one.name = new char[12]; // an array of 12 elements in the heap delete[] one.name; // freeing up memory char* c = new char('C'); // a single char in the heap delete c;
不要混用new, delete
使用malloc, free
new, delete
malloc, free
:
這是未定義的行為,因為無法可靠地證明指針后面的內存已正確分配(即,對於delete來說是new,對於delete []是new [])。 確保這樣的事情不會發生是您的工作。 使用正確的工具(即智能指針)很簡單。 每當您說刪除時,您就做錯了。
如果您不想使用唯一/共享的指針,則可以使用構造函數進行分配,並使用析構函數自動釋放內存。
如果結構中的原始指針是觀察指針,則不必刪除內存(當然,代碼中某處的人必須釋放內存)。
但是,如果原始指針是所有者指針,則必須釋放它。
通常,對new[]
每次調用都必須具有對delete[]
的匹配調用,否則會浪費內存。
在您的代碼中,您調用了new[]
,因此必須調用delete[]
才能正確釋放內存。
在C ++中,您可以避免容易出錯的易於泄漏的原始指針,而改用智能指針或容器類(例如std::vector
, std::string
等)。
創建結構並不意味着它將在C ++中處理垃圾回收,因此沒有垃圾回收,因此對於使用new分配的每個內存,都應使用delete關鍵字釋放空間。 如果您用JAVA編寫代碼,則不必刪除,因為垃圾收集器會自動刪除未使用的引用。
實際上,該結構不會釋放或刪除您已創建的內存。 如果要釋放空間,可以執行以下操作。
#include <iostream>
using namespace std;
int main()
{
char *c = new char[12];
delete[] c;
return(0);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.