删除超出范围的变量

delete a variable out of scope

本文关键字:变量 范围 删除      更新时间:2023-10-16
int* func()
{
   int* i=new int[1];
   //do something
   return i; 
}
void funcc()
{
   int* tmp=func();
   //delete allocated memory after use
   delete tmp;
}

删除第二个函数中所述的工作应该是正确的用法吗?我想我没有通过新的为它分配内存?可以肯定的是,第一个使用了新

应该是delete [] tmp;的,因为你正在做数组新,但除此之外,它是正确的。

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

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

分配了new.您在函数中为i分配的内存地址被传回以存储在tmp中,因此它确实指向由new分配的内存。

您是对的,此时i本身超出了范围,但new分配的内存在退出函数时在范围更改中幸存下来。而且,由于您将其位置存储到 tmp 中,您仍然可以访问它。

因此,删除(一旦你用[]将其作为数组删除(是非常有效的。

这是

未定义的行为™。仅当您使用 new 时,才能使用delete。如果您使用了new[],则必须delete[]它。更重要的是,这是非常不安全的代码 - 你需要一个智能指针。

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

如果你在函数之外做delete []tmp也没关系。这样做是可以的。您需要记住的所有内容是删除的形式

  • 我的间谍感官告诉我,你想知道你在func中创建的动态分配int是否与你试图在funccdelete的相同。

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

  • 但是,请记住在使用new[](带[](时使用delete[](带[](。在修复此问题之前,您的代码已损坏。


另外,尽量避免在一个地方new,在另一个地方delete。也许可以考虑使用std::vector,这更不容易出错。