C ++如何正确释放内存?

时间:2017-03-12 12:17:30

标签: c++

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的内存并释放已经正确使用的内存。

6 个答案:

答案 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

您可以释放ab,其中至少有一个,它们指向相同的内存块。您必须免费c

答案 2 :(得分:1)

  

执行上面的代码后,有内存&#34; a&#34;本来   指着被释放了?

是的,内存已被释放。在c=a时,delete [] c;会清除a

的记忆

但是,您不需要*c清除记忆,只需直接删除ab

delete[]a;
delete[]b;

<强>更新

正如你已经编辑了你的答案,现在你想要达到的目标更清楚了,即。 b通过a指向的访问内存,但在此之前,您希望释放a指向的内存。所以,这就是你需要做的事情:

1 - 首先释放a

指向的内存
delete []a;

2 - 现在将a指向b指向的内存位置

a=b;

现在a最初指向的内存位置已清除,a现在指向b指向的位置。

注意:请注意,如果同时使用ab指向相同的内存位置,请使用delete []a或{ {1}},delete []ba指向的内存位置将被清除。

答案 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;
    }
});

您不需要每次迭代分配/释放内存。但是如果你有多线程,那将会更复杂一些。

使用类似的方法,我大大提高了科学项目的计算速度。

您的代码应该对每个人都清楚。想想谁将会追随你。如果在可读性和速度之间做出选择 - 应该选择可读性。