1

假设我们有以下 C++ 代码:

while(condition)
{
   Node* temp = SomeNode->next;
   //...
}

destructor()
{
     //delete Nodes;
}

temp是一个局部指针变量,CurrentNode是一个公共类属性。公共节点和相关节点在析构函数中被释放。但是所有局部范围的指针变量会发生什么。指针数据类型消耗一些内存,例如 4 个字节或更多(取决于内存空间),仅用于地址。在这里,temp局部变量没有用'new'初始化,只是一个指向其他节点的指针,基于此,temp局部变量是在堆栈上还是在堆上?这个局部变量是在退出块后很快自动销毁还是它是动态内存但需要使用 of delete. 我在某处看到了一些代码,这些代码不能delete用来释放不是用new. 我想确定他是否错过了释放变量,或者还有其他一些我不知道的故事。谢谢。

4

5 回答 5

4

temp 变量是一个压入堆栈的指针。它在超出您的“While”语句的范围后被释放。

于 2013-07-20T14:23:21.913 回答
2

变量temp是指向Node对象的指针。根据您的系统,它很可能是存储内存偏移量的单个整数。

当您创建这样的指针时,它会在堆栈上分配并在范围结束时回收:

{ // Enter Scope
    Object* pObj; // A local variable created on the stack
} // pObj is reclaimed as would any other local variable.

当您动态分配内存(使用newor new[])并将指针分配给内存地址并且在指针超出范围并被回收之前不delete(或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变量,这一切都取决于Node::next函数的实现以及调用它时所拥有的“合同”。

于 2013-07-20T14:26:07.853 回答
2

如果变量没有被分配new(或其他一些被记录为返回在堆上分配的东西的函数,比如mallocmake_shared或其他),那么它具有自动存储。

当包含范围退出时,变量被销毁。如果您使用 C++ 工作,这是一个极其重要的概念,因为它构成了应该如何进行内存管理和其他资源管理的基本基础。搜索 RAII 了解更多详情。

于 2013-07-20T14:24:56.750 回答
1

指针temp在栈上;Node它指向的在堆上。

当您退出包含块时,所有局部变量都会自动销毁。对于指针和其他简单的东西(整数、布尔值),除了回收堆栈空间之外,这种销毁不需要做任何事情。对于类类型的变量,析构函数将运行,允许它们进行任何需要的额外清理。

另请注意,如果您这样做了,delete temp;您将要求释放 temp 指向的内存;temp 本身仍然存在,您可以稍后为其分配一个新值。

于 2013-07-20T14:27:19.360 回答
1

内存管理的概念是删除你用 new、alloc 或 malloc 分配的内存,否则会有一些内存泄漏。显然,管理分配的内存的唯一方法是删除。然而,这可以在析构函数中完成。这意味着只有类变量被删除。所以没有办法删除在函数中定义的局部变量。因为它们只存在于它们的范围内。

处理局部变量时,需要一些技术,即您可以在最终会被删除的函数中使用类变量,或者您可以声明一个仅指向某个内存地址而不实际为其分配一些内存的指针。

于 2013-07-20T17:10:19.350 回答