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

C++ C++;:删除堆栈上声明的结构的字段,c++,struct,heap-memory,stack-memory,C++,Struct,Heap Memory,Stack Memory,如果我声明这样的结构: struct MyStruct { int* nums; }; MyStruct ms; ms.nums = new int[4]; 我是否需要调用delete ms.nums退出我的程序之前,或者成员变量nums是否会自动解除分配,因为MyStruct实例ms没有在堆上声明?您始终必须调用delete来解除分配使用new显式分配的所有内存 使用new分配内存时,内存在堆中分配,并返回块的基址 您的结构存在于堆栈中,该堆栈包含指向该基址的指针。当struct对

如果我声明这样的结构:

struct MyStruct
{
    int* nums;
};

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

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

您始终必须调用
delete
来解除分配使用
new
显式分配的所有内存

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


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

您必须始终调用
delete
来取消分配使用
new
显式分配的所有内存

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


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

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

取消分配
delete

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

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


但是,
nums
指向的内存将不可用。您应该调用
delete[]ms.nums

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


但是,
nums
指向的内存将不可用。您应该调用
delete[]ms.nums在程序退出之前。

是的,您必须删除它。。结构的默认析构函数不会这样做。它只会删除保存对象地址的指针变量,对象将永远处于孤立状态

最好在结构的析构函数中进行删除

struct MyStruct
{
  int* nums;

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

是的,你必须删除它。。结构的默认析构函数不会这样做。它只会删除保存对象地址的指针变量,对象将永远处于孤立状态

最好在结构的析构函数中进行删除

struct MyStruct
{
  int* nums;

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

struct
在堆栈上分配,它基本上是指向数组的
指针。
数组是在堆上分配的
。每次写“new”时,这意味着分配在堆上,因此需要
“删除”
它。另一方面,一旦退出函数,结构将被删除。

堆栈上分配了
结构
,它基本上是指向数组的
指针。
数组是在堆上分配的
。每次写“new”时,这意味着分配在堆上,因此需要
“删除”
它。另一方面,一旦退出函数,结构将被删除。

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

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

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

由于通常很难正确执行此操作,为什么不使用库类为您正确管理阵列呢

#include <vector>

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

MyStruct ms;
ms.nums.resize(4);
#包括
结构MyStruct
{
std::向量nums;
};
MyStruct ms;
ms.nums.resize(4);

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

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