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在程序退出之前执行code>。当包含它的结构从堆栈中弹出时,成员变量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删除它代码>,在