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
必须保留用于其他用途,因此禁止直接删除。
此代码的目的是通过b
访问属于a
的内存并释放已经正确使用的内存。
答案 0 :(得分:2)
是的,内存已被释放。但是,在更改指针指向的内容时要非常小心,因为它很容易导致内存泄漏。
答案 1 :(得分:1)
已释放。
因为在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
。
答案 2 :(得分:1)
执行上面的代码后,有内存&#34; a&#34;本来 指着被释放了?
是的,内存已被释放。在c=a
时,delete [] c;
会清除a
。
但是,您不需要*c
清除记忆,只需直接删除a
和b
delete[]a;
delete[]b;
<强>更新强>
正如你已经编辑了你的答案,现在你想要达到的目标更清楚了,即。 b
通过a
指向的访问内存,但在此之前,您希望释放a
指向的内存。所以,这就是你需要做的事情:
1 - 首先释放a
delete []a;
2 - 现在将a
指向b
指向的内存位置
a=b;
现在a
最初指向的内存位置已清除,a
现在指向b
指向的位置。
注意:请注意,如果同时使用a
和b
指向相同的内存位置,请使用delete []a
或{ {1}},delete []b
和a
指向的内存位置将被清除。
答案 3 :(得分:1)
是的。指针是碰巧包含地址的常规变量。由于a被分配给c。您的第一个分配已被释放。
答案 4 :(得分:0)
delete
视为而不是作用于指针,而是指向它所指向的对象时,可以避免很多混乱。它不是删除的指针,而是数组。以这个例子为例,它实际上与你的非常相似:
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;
对c
的唯一影响是我们之后不允许对其进行退款,但删除的内容首先是带有Foo
的{{1}}对象,然后id 1
的那个。
答案 5 :(得分:0)
另一种方式 - 您可以考虑优化。也许你不需要在这里分配内存。 看这个案例
v.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent arg1) {
final ImageView view = (ImageView) v;
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN: {
if(toState == 1){
view.setImageResource(R.mipmap.dot_on);
}else if(toState == 0){
view.setImageResource(R.mipmap.dot_off);
}
break;
}
case MotionEvent.ACTION_MOVE:{
if(toState == 1){
view.setImageResource(R.mipmap.dot_on);
}else if(toState == 0){
view.setImageResource(R.mipmap.dot_off);
}
break;
}
case MotionEvent.ACTION_UP: {
if(toState == 1){
view.setImageResource(R.mipmap.dot_on);
}else if(toState == 0){
view.setImageResource(R.mipmap.dot_off);
}
break;
}
}
return true;
}
});
您不需要每次迭代分配/释放内存。但是如果你有多线程,那将会更复杂一些。
使用类似的方法,我大大提高了科学项目的计算速度。
您的代码应该对每个人都清楚。想想谁将会追随你。如果在可读性和速度之间做出选择 - 应该选择可读性。