簡體   English   中英

C ++如何正確釋放內存?

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

你可以釋放ab ,至少其中一個,它們指向同一個內存塊。 你必須釋放c

執行上面的代碼后,最初指向的內存“a”是否已被釋放?

是的,內存被釋放了。 c=adelete [] c; 清除內存a

但是,您不需要*c來清除內存,只需直接刪除ab

delete[]a;
delete[]b;

UPDATE

正如你已經編輯了你的答案,現在你更清楚你想要實現的是什么,即b通過a指向的訪問內存,但在此之前你想釋放a指向的內存。 所以這就是你需要做的:

1-首先釋放a指向的內存

delete []a;

2-現在將a指向b指向的內存位置

a=b;

現在的內存位置原本指向a被清除, a現在指向哪里b指向。

注:請記住,現在當你同時擁有ab指向同一個內存位置,如果您使用delete []adelete []b ,內存位置都指向ab將被清除。

是的,它有。 指針是碰巧包含地址的常規變量。 由於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.

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