假设我们有以下C ++代码:
while(condition)
{
Node* temp = SomeNode->next;
//...
}
destructor()
{
//delete Nodes;
}
此处temp
是本地指针变量,CurrentNode
是公共类属性。公共节点和相关节点在析构函数中被释放。但是所有本地范围的指针变量会发生什么。指针数据类型消耗一些内存,例如4个字节或更多(取决于存储空间),仅用于地址。 这里,temp
局部变量没有用'new'初始化,只是一个指向其他节点的指针,基于此,在堆栈上创建了temp
局部变量还是在堆上?退出块后,此局部变量是否会立即自动销毁,或者是动态内存还是需要使用delete
。我在某处找到了一些没有使用delete
的代码来释放未使用new
创建的本地指针。而且我想确定他是否错过了释放变量或者还有其他一些我不知道的故事。感谢。
答案 0 :(得分:4)
temp变量是一个被推入堆栈的指针。它会在超出范围之后被释放,这是你的“同时”声明。
答案 1 :(得分:2)
如果变量未分配new
(或记录的某些其他函数返回堆上分配的内容,如malloc
,make_shared
或其他任何内容) ,然后它有自动存储。
当包含范围退出时,变量将被销毁。如果您使用的是C ++,这是一个非常重要的概念,因为它构成了应该如何完成内存管理和其他资源管理的基础。搜索RAII了解更多详情。
答案 2 :(得分:2)
变量temp
是指向Node
对象的指针。根据您的系统,它很可能是一个存储内存偏移量的整数。
当你制作这样的指针时,它会在堆栈上分配并在范围的末尾回收:
{ // Enter Scope
Object* pObj; // A local variable created on the stack
} // pObj is reclaimed as would any other local variable.
当您动态分配内存(使用new
或new[]
)并分配指向内存地址的指针而不是delete
(或{{1指针超出范围并被回收之前的内存(此时你无法释放已分配的内存)。
delete[]
至于您是否需要{ // Enter Scope
Object* pObj = new Object; // Local pointer to an Object in the heap
} // pObj is reclaimed but the Object which it was pointed to is not.
// We have a memory leak.
(或delete
)delete[]
变量,这一切都取决于temp
函数的实现和“合同”你打电话的时候有。
答案 3 :(得分:1)
指针temp
在堆栈上;它指向的Node
在堆上。
退出包含块时,将自动销毁所有局部变量。对于指针和其他简单的东西(整数,布尔),除了回收堆栈空间之外,这种破坏不需要做任何事情。对于类类型的变量,析构函数将运行,允许它们进行所需的任何额外清理。
另请注意,如果你做delete temp;
,你会要求释放临时指向的内存; temp本身仍然存在,您可以稍后为其分配一个新值。
答案 4 :(得分:1)
内存管理的概念是删除用new,alloc或malloc分配的内存,否则会有一些内存泄漏。显然,管理分配内存的唯一方法是删除。然而,这可以在析构函数中完成。其中,表示只删除类变量。因此无法删除函数中定义的局部变量。因为它们只存在于其范围内。
当处理局部变量时,需要一些技术,即你可以在一个最终会被删除的函数中使用类变量,或者你可以声明一个只指向某个内存地址而不实际分配一些内存的指针。