C ++:关于释放内存的问题

时间:2010-06-05 17:34:21

标签: c++ memory-management pointers

在学习C ++时,他们将其写成了自由记忆:

int *pnValue = new int; // dynamically allocate an integer
*pnValue = 7; // assign 7 to this integer
delete pnValue;
pnValue = 0;

我的问题是:“是否需要正确释放内存的最后一句话,完整?”

我认为指针*pnValue仍然在堆栈上,new对指针没有任何意义。如果它在堆栈上,它将在应用程序离开作用域时被清除(指针被声明在哪里),不是吗?

2 个答案:

答案 0 :(得分:3)

没有必要,但是当你完成它们时,将指针设置为NULL(0)总是一个好主意。这样,如果你将它传递给一个函数(这将是一个bug),它可能会给你一个错误,而不是试图操作无效的内存(使错误更容易追踪)。它也使条件更简单。

答案 1 :(得分:2)

删除后指针设置为NULL(或零)是没有必要的。不过这是一个很好的做法。首先,如果稍后取消引用指针,则无法访问某些随机数据。此外,您经常会找到以下代码:

if(ptr)
{
  delete ptr;
  ptr = NULL;
}

因此将指针设置为NULL将确保它不会被删除两次。

最后,你可能会找到这样的代码:

void foo(bar *ptr)
{
  if(!ptr) throw Exception(); // or return, or do some other error checking
  // ...
}

你可能希望安全检查能够被击中。