C ++:删除在堆栈上声明的结构的字段

时间:2014-02-06 06:23:55

标签: c++ struct stack heap

如果我声明一个像这样的结构:

struct MyStruct
{
    int* nums;
};

MyStruct ms;
ms.nums = new int[4];

我是否需要在退出程序之前调用delete ms.nums;,否则成员变量nums会自动解除分配,因为未在堆上声明MyStruct实例ms

7 个答案:

答案 0 :(得分:5)

是的,您必须删除.. struct的默认析构函数不会这样做。它只会删除保存对象地址的指针变量,并且对象将永远保持不变。

最好在struct的析构函数

中进行删除
struct MyStruct
{
  int* nums;

  public :
     ~MyStruct()
      {
        if(nums != NULL)
            delete nums;
      }
};

答案 1 :(得分:4)

当包含它的结构nums从堆栈中弹出时,成员变量ms(它是一个指针)将自动解除分配。

但是,nums指向的内存不会。在程序退出之前,您应该致电delete [] ms.nums;

答案 2 :(得分:2)

您始终必须调用delete来释放使用new明确分配的所有内存。

使用new分配内存时,将在堆中分配内存,并返回该块的基址。

您的struct存在于堆栈中,其中包含指向该基址的指针。当struct对象离开作用域时,对象被释放,即指针包含分配的堆内存块的地址已经消失,但堆内存本身仍然被分配,您现在无法解除分配。 / p>

答案 3 :(得分:1)

如果分配了内存并且指针返回到delete,则需要调用num。这里num是结构内的指针。声明结构变量时会分配num的内存。但是new分配的内存地址应该通过调用delete

取消分配

答案 4 :(得分:1)

当对象被销毁时,指针本身的内存将被释放,就像任何类成员一样。但是,它指向的数组不会被删除 - 无法知道指针指向的是什么,是由new还是new[]分配还是根本没有动态分配,或者是否其他任何东西仍然想要使用它。为避免内存泄漏,您应该使用数组形式delete [] ms.nums;将其删除。

由于通常很难正确执行此操作,为什么不使用库类来正确管理数组呢?

#include <vector>

struct MyStruct
{
    std::vector<int> nums;
};

MyStruct ms;
ms.nums.resize(4);

现在,当ms被销毁时,所有内存都将自动释放;并且该类可以正确复制,并且(因为C ++ 11)可以有效地移动。

答案 5 :(得分:0)

struct在堆栈上分配,基本上是pointer to an Arrayarray is allocated on the heap。每次你写“新”意味着分配在堆上,因此你需要"delete"它。另一方面,退出函数后,结构将被删除。

答案 6 :(得分:0)

程序退出时,OS将释放程序分配的所有内存。 另一方面,如果在程序的生命周期中多次发生内存分配,那么肯定应该释放它以防止悬空指针。