如果我使用
声明临时自动删除的字符缓冲区std::auto_ptr<char> buffer(new char[n]);
然后当缓冲区超出范围时自动删除缓冲区。我假设使用delete删除缓冲区。
但是缓冲区是使用new []创建的,因此严格来说应该使用delete []删除缓冲区。
这种不匹配可能导致内存泄漏的可能性有多大?
答案 0 :(得分:19)
在使用new []分配的指针上调用delete的行为是undefined。如您所愿,当智能指针超出范围时,auto_ptr does call delete。你不必担心内存泄漏 - 崩溃和其他奇怪的行为是可能的。
如果您不需要转移指针的所有权,Boost的scoped_array类可能就是您要找的。 p>
答案 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 []分配)
答案 7 :(得分:0)
对于一个非常简单的解决方案来说,这似乎非常复杂。你使用
有什么问题 char *c=new char[n]
在这里,然后删除它? 或者,如果您需要更多动态解决方案,
vector<char> c
奥卡姆的剃刀,伙计。 : - )