删除范围外的变量

时间:2011-08-22 22:37:14

标签: c++

int* func()
{
   int* i=new int[1];
   //do something
   return i; 
}

void funcc()
{
   int* tmp=func();
   //delete allocated memory after use
   delete tmp;
}

应该删除第二个功能中描述的工作是否正确使用? 我想我没有为新分配内存?肯定是第一次使用new。

5 个答案:

答案 0 :(得分:7)

它应该是delete [] tmp;,因为你正在做数组新的,但是否则,它是正确的。

答案 1 :(得分:3)

这是Undefined Behavior™。如果您使用delete,则可以使用new。如果您使用new[],则必须delete[]。更重要的是,这是一个非常不安全的代码 - 你需要一个智能指针。

答案 2 :(得分:3)

没有。 new T[]应与delete []t匹配。 new T应与delete t匹配。否则,您的代码将调用未定义的bevavior。

如果你在函数之外做delete []tmp并不重要。可以这样做。所有你需要记住删除的表单

答案 3 :(得分:3)

  • 我的蜘蛛侠意识告诉我,您想知道在int中创建的动态分配的func是否与您在delete中尝试的funcc相同delete[]

    答案是:是的。虽然您不使用严格相同的指针变量,但两个指针都指向同一对象

  • ,请在使用[]时使用new[](使用[])(new) 。在您修复此问题之前,您的代码已被破坏。


另外,尽量避免delete在一个地方,std::vector在另一个地方。{{1}}。或许可以考虑使用{{1}},而不是容易出错。

答案 4 :(得分:3)

正如其他人所说,您应该使用delete[]删除数组,而不是delete

但是,如果您问是否可以删除tmp,因为它指向的内存未分配new,那么您的前提是不正确的。

分配了new。您在i函数中分配的内存地址将被传回存储在tmp中,因此 指向由{{1}分配的内存}}

你是正确的new本身超出了范围,但i分配的内存在退出函数时仍然存在范围变化。而且,由于您将其位置存储到new,因此您仍然可以访问它。

因此删除(一旦你使用tmp删除数组)是完全有效的。