Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:关于释放内存的问题_C++_Memory Management_Pointers - Fatal编程技术网

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

C++ C++;:关于释放内存的问题,c++,memory-management,pointers,C++,Memory Management,Pointers,我的问题是:“是否需要最后一条语句来正确、完整地释放内存?” 我认为指针*pnValue仍然在堆栈上,并且new对指针没有任何意义。如果它在堆栈上,那么当应用程序离开作用域(在其中声明指针)时,它将被清除,不是吗?这不是必需的,但在处理完指针后,最好将其设置为NULL(0)。这样,如果您将它传递给一个函数(这将是一个bug),它可能会给您一个错误,而不是试图对无效内存进行操作(使bug更容易跟踪)。它还使条件语句变得更简单。这不是必需的,但在使用完指针后,最好将其设置为NULL(0)。这样,如果

我的问题是:“是否需要最后一条语句来正确、完整地释放内存?”


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

这不是必需的,但在处理完指针后,最好将其设置为NULL(0)。这样,如果您将它传递给一个函数(这将是一个bug),它可能会给您一个错误,而不是试图对无效内存进行操作(使bug更容易跟踪)。它还使条件语句变得更简单。

这不是必需的,但在使用完指针后,最好将其设置为NULL(0)。这样,如果您将它传递给一个函数(这将是一个bug),它可能会给您一个错误,而不是试图对无效内存进行操作(使bug更容易跟踪)。而且它还使条件句更简单。

删除后将指针设置为NULL(或零)是不必要的。然而,这是一种良好的做法。首先,如果以后取消对指针的引用,您将无法访问一些随机数据。此外,您经常会发现以下代码:

if(ptr)
{
  delete ptr;
  ptr = NULL;
}
因此,将指针设置为NULL将确保它不会被删除两次

最后,您可能会发现如下代码:

void foo(bar *ptr)
{
  if(!ptr) throw Exception(); // or return, or do some other error checking
  // ...
}
您可能希望点击安全检查。

删除后将指针设置为NULL(或零)是没有必要的。然而,这是一种良好的做法。首先,如果以后取消对指针的引用,您将无法访问一些随机数据。此外,您经常会发现以下代码:

if(ptr)
{
  delete ptr;
  ptr = NULL;
}
因此,将指针设置为NULL将确保它不会被删除两次

最后,您可能会发现如下代码:

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


您可能希望安全检查被点击。

如果
在这里是完全冗余的--只需执行
删除ptr;ptr=0。删除空指针是不可操作的,因此当您分配零时,甚至不需要再进行
if
检查。我认为删除它后最好将其设置为空。如果你删除了一个指针,它的值应该是无关的,因为你对指针做的最后一件事就是删除它。如果你还留着它,那你就做错了。不仅如此,你不应该真的需要删除它,它应该为你做(这可以追溯到不必担心再次使用它。)如果我最终有糟糕的设计并保留了我不需要的指针,至少一个非空值可能会崩溃,让我知道我的设计有问题,@GMan“如果您删除了指针,它的值应该是无关的,因为您对指针所做的最后一件事就是删除它。”但只适用于本地非静态指针。其他所有内容都将保持可见和活动状态,以便您可以从
0
中获益,从而尽早崩溃或(我认为更重要的是)为了有更多的可能性来分析指针的状态以进行跟踪、延迟加载资源等@Johannes:但这就离开了“这是安全的良好实践”栏位,转到了“我正在使用它的值作为标志”栏位。:@Johannes:不会
删除p;p=reinterpret_cast(0xd31373d);
(这个数字是1337表示“已删除”)在决定性崩溃方面甚至更好
if
在这里是完全冗余的-.-只需执行
delete ptr;ptr=0;
。删除空指针是不可操作的,因此当您指定零时,甚至不需要再进行
if
检查。我认为删除指针后将其设置为空是有争议的。如果删除指针,其值应该是无关的因为你对指针所做的最后一件事是删除它。如果你仍然有它,那你就是做错了。不仅如此,你不应该真的需要删除它,它应该为你做(这意味着你不必担心再次使用它)如果我的设计很差,并且保留了我不需要的指针,那么至少一个非空值可能会崩溃,让我知道我的设计有问题,@GMan“如果你删除了一个指针,它的值应该是无关的,因为你对指针做的最后一件事就是删除它。“但仅适用于本地非静态指针。其他一切都将保持可见和活动状态,这样您就可以从
0
早期崩溃中获益,或者(更重要的是,我认为)有更多的可能性来分析指针的状态,以便进行跟踪、延迟加载资源等。@Johannes:但这将使“这是安全的良好实践”着陆并移动到“我正在使用它的值作为一个标志”land.:]@Johannes:不会删除p;p=reinterpret_cast(0xd31373d);
(1337代表“已删除”)在决定性崩溃方面会更好吗?:)~是的,但不是相反的顺序吗?你真的会在删除后设置它吗?更好的办法是确保指针释放时超出范围。不要让自由指针散布在代码中。用RAII类或智能指针包装它们。@drache:你的意思是
p=0;删除p;
?这没有任何意义,会导致内存泄漏。@drachenstern,您不能在删除之前设置它,否则您将无法再删除它。@jalf:当然可以,但这会改变问题的上下文;)~是的,但这不是按相反的顺序吗?您真的会在删除之后设置它吗?我有一个更好的主意s以确保指针在释放时超出作用域。不要让空闲指针散布在代码中。将它们包装在RAII类或智能指针中。@drache:你是说
p=0;delete p;
?这毫无意义,会导致内存泄漏。@drachenstern,你不能使用它