使用删除超出这样的范围是不正确的?

时间:2014-04-23 16:38:18

标签: c++ new-operator

int* func()
{
   int* i=new int[3];
   return i; 
}

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

我的意见是编译器在编译funcc时无法知道有3个int要删除,例如func是否在另一个文件中。

2 个答案:

答案 0 :(得分:6)

C++ FAQ lite

中介绍了这一点
  

[16.14]在p = new Fred [n]之后,编译器如何知道有n   删除期间要删除的对象[] p?

     

简短回答:魔术。

     

答案很长:运行时系统存储对象的数量n,   如果你只知道指针,那么它可以被检索到的地方,p。   有两种流行的技术可以做到这一点。这两种技术   正在商业级编译器使用,两者都有权衡,和   既不完美。这些技巧是:

     
      
  • 过度分配数组并将n放在第一个Fred对象的左侧。
  •   
  • 使用关联数组,其中p为键,n为值。
  •   

答案 1 :(得分:6)

这就是delete打算使用的方式,而且很好。数组大小存储在幕后的某个地方,这样delete[]无论发生在哪里都会做正确的事情。

然而,像这样的杂耍指针容易出错:在删除数组之前很容易丢失指针,或者逻辑变得如此复杂以至于你最终删除了两次相同的数组。你最好用一个类为你管理数组:

#include <vector>

std::vector<int> func() {
    return std::vector<int>(3);
}

void funcc() {
    auto tmp = func();
    // no need to do anything - the vector frees its memory automatically
}