繁体   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