将auto_ptr与new char [n]一起使用是错误的

时间:2008-11-04 09:31:07

标签: c++ stl memory-leaks auto-ptr

如果我使用

声明临时自动删除的字符缓冲区
std::auto_ptr<char> buffer(new char[n]);

然后当缓冲区超出范围时自动删除缓冲区。我假设使用delete删除缓冲区。

但是缓冲区是使用new []创建的,因此严格来说应该使用delete []删除缓冲区。

这种不匹配可能导致内存泄漏的可能性有多大?

8 个答案:

答案 0 :(得分:19)

在使用new []分配的指针上调用delete的行为是undefined。如您所愿,当智能指针超出范围时,auto_ptr does call delete。你不必担心内存泄漏 - 崩溃和其他奇怪的行为是可能的。

如果您不需要转移指针的所有权,Boost的scoped_array类可能就是您要找的。

答案 1 :(得分:10)

我会使用char矢量作为缓冲区。

std::vector<char>    buffer(size);

read(input,&buffer[0],size);

基本上,如果你不需要,你甚至不想打电话给新人 向量提供运行时大小的缓冲区,您可以像数组(缓冲区)一样使用。

最好的部分是向量在自身之后进行清理,并且标准保证向量中的所有元素都将处于有余存储中。非常适合缓冲。

或者更合理的保证是:

(&buffer[0]) + size == (&buffer[size])

答案 2 :(得分:7)

产生未定义的行为(可能比内存泄漏更糟,例如堆损坏)请尝试boost's scoped_array or shared_array

答案 3 :(得分:6)

对于使用new []分配的数据调用delete是未定义的。这意味着编译器可以生成可以执行任何操作的代码。但是在这种情况下它可能有效,因为不需要破坏数组中的各个字符,只需要数组本身。

由于此行为未定义,我强烈建议您改用std::vector<char>boost::scoped_array<char> / boost::shared_array<char>。在这种情况下,所有这些都是使用std::auto_ptr<>的完全可行且优越的选项。如果使用std::vector,您还可以根据需要动态增大缓冲区。

答案 4 :(得分:5)

有没有充分的理由不使用std :: string? std :: vector,正如其他人所建议的那样?你所做的是错的,但不知道你想要做什么推荐别的东西很难。

答案 5 :(得分:4)

是的,这是错的。用简单的包装纸包裹。

typedef< typename T_ >
struct auto_vec{
  T_* t_;
  auto_vec( T_* t ): t_( t ) {}
  ~auto_vec() { delete[] t_; }
  T_* get() const { return t_; }
  T_* operator->() const { return get(); }
  T_& operator*() const { return *get(); }
  /* you should also define operator=, reset and release, if you plan to use them */
}

auto_vec<char> buffer( new char[n] );

答案 6 :(得分:2)

问题问题已经过去了几年。

但是我从搜索中点击了这个页面,所以我想我也可以注意到: std :: unique_ptr ,auto_ptr的C ++ 11替换,可以处理删除使用new []创建的对象。

  

std :: unique_ptr有两个版本:1)管理生命周期   单个对象(例如,使用new分配) 2)管理a的生命周期   动态分配的对象数组(例如,使用new []分配)

cppreference unique_ptr

答案 7 :(得分:0)

对于一个非常简单的解决方案来说,这似乎非常复杂。你使用

有什么问题
 char *c=new char[n] 

在这里,然后删除它? 或者,如果您需要更多动态解决方案,

vector<char> c

奥卡姆的剃刀,伙计。 : - )