[英]C++ how to correctly free memory?
int main(){
int *a = new int[5];
int *b = new int[10];
int *c;
for (int i = 0; i < 5; ++i){
a[i] = i * i;
}
for (int i = 0; i < 10; ++i){
b[i] = 50;
}
c = a;
a = b;
delete[]b;
delete[]c;
return 0;
}
上面的代碼執行后,有記憶a
原來指向被釋放?
如果沒有,如何正確釋放?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
指針a
必須保留用於其他用途,因此禁止直接刪除。
該代碼的目的是通過a
訪問屬於b
的存儲器並釋放用於正確擁有的存儲器。
是的,內存被釋放了。 但是,在更改指針指向的內容時要非常小心,因為它很容易導致內存泄漏。
它被釋放了。
因為在c = a;
, c
持有的內存地址a
原來指向。 而你已經釋放c
通過delete [] c;
。
// Assume originally a -> 1, b -> 2
c = a; // Now a -> 1, b -> 2, c -> 1
a = b; // Now a -> 2, b -> 2, c -> 1
你可以釋放a
或b
,至少其中一個,它們指向同一個內存塊。 你必須釋放c
。
執行上面的代碼后,最初指向的內存“a”是否已被釋放?
是的,內存被釋放了。 當c=a
, delete [] c;
清除內存a
。
但是,您不需要*c
來清除內存,只需直接刪除a
和b
delete[]a;
delete[]b;
UPDATE
正如你已經編輯了你的答案,現在你更清楚你想要實現的是什么,即b
通過a
指向的訪問內存,但在此之前你想釋放a
指向的內存。 所以這就是你需要做的:
1-首先釋放a
指向的內存
delete []a;
2-現在將a
指向b
指向的內存位置
a=b;
現在的內存位置原本指向a
被清除, a
現在指向哪里b
指向。
注:請記住,現在當你同時擁有a
和b
指向同一個內存位置,如果您使用delete []a
或delete []b
,內存位置都指向a
和b
將被清除。
是的,它有。 指針是碰巧包含地址的常規變量。 由於a被分配給c。 您的第一個分配已被釋放。
當您認為delete
不是作用於指針,而是指向它指向的對象時,Imho可以避免很多混亂。 它不是刪除的指針,而是數組。 舉個例子,這個例子與你的非常相似:
struct Foo {
int id;
Foo(int i) : id(i) {}
};
Foo* a = new Foo(1);
Foo* b = new Foo(2);
Foo* c;
c = a;
delete c;
c = b;
delete c;
delete c;
的唯一效果delete c;
在c
上我們不允許我們之后退出它,但刪除的是首先是id 1
為1的Foo
對象,然后是id 2
那個。
另一種方式 - 您可以考慮優化。 也許你不需要在這里分配內存。 看這個案子
int a[5];
int b[10];
int func(int param) {
for (int i = 0; i < 5; ++i){
a[i] = i * i;
}
for (int i = 0; i < 10; ++i){
b[i] = 50;
}
}
int main(){
for (int i = 0; i < 10000; ++i){
func(i);
}
return 0;
}
每次迭代不需要分配/釋放內存。 但是如果你有多線程,它會更復雜一些。
使用類似的方法,我大大提高了科學項目的計算速度。
你的代碼應該對每個人都清楚。 想想誰將會追隨你。 如果在可讀性和速度之間做出選擇 - 應該選擇可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.