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