如果我声明一个像这样的结构:
struct MyStruct
{
int* nums;
};
MyStruct ms;
ms.nums = new int[4];
我是否需要在退出程序之前调用delete ms.nums;
,否则成员变量nums
会自动解除分配,因为未在堆上声明MyStruct实例ms
?
答案 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 Array
。 array is allocated on the heap
。每次你写“新”意味着分配在堆上,因此你需要"delete"
它。另一方面,退出函数后,结构将被删除。
答案 6 :(得分:0)
程序退出时,OS将释放程序分配的所有内存。 另一方面,如果在程序的生命周期中多次发生内存分配,那么肯定应该释放它以防止悬空指针。