。我会假设使用delete删除缓冲区。是,如果我使用声明</p> <pre><code>std::auto_ptr<char> buffer(new char[n]); </code></pre> <p>那么当缓冲区超出范围缓冲区自动删除的临时自动删除字符缓冲区是错误的使用auto_ptr新的char [N]
但是,缓冲区是使用new []创建的,因此严格地说应该使用delete []删除缓冲区。
这种不匹配可能导致内存泄漏的可能性有多大?
。我会假设使用delete删除缓冲区。是,如果我使用声明</p> <pre><code>std::auto_ptr<char> buffer(new char[n]); </code></pre> <p>那么当缓冲区超出范围缓冲区自动删除的临时自动删除字符缓冲区是错误的使用auto_ptr新的char [N]
但是,缓冲区是使用new []创建的,因此严格地说应该使用delete []删除缓冲区。
这种不匹配可能导致内存泄漏的可能性有多大?
在用new []分配的指针上调用delete的行为是undefined。正如您所设想的,当智能指针超出范围时,auto_ptr does call delete。这不仅仅是你必须担心的内存泄漏 - 崩溃和其他奇怪的行为是可能的。
如果您不需要传输指针的所有权,那么Boost的scoped_array类可能就是您要查找的内容。
产生未定义的行为(可能比内存泄漏更糟糕,例如堆损坏)尝试使用boost's scoped_array or shared_array。
调用删除用new []分配的数据是未定义的。这意味着编译器可能会生成可能做任何事情的代码。但是在这种情况下,它可能是有效的,因为不需要破坏数组中的各个字符,只需要数组本身。
由于此行为尚未定义,因此我强烈建议您使用std::vector<char>
或boost::scoped_array<char>/boost::shared_array<char>
代替。在这种情况下,所有使用std::auto_ptr<>
都是完全可行的和优越的选择。如果您使用std::vector
,您还可以根据需要动态增加缓冲区。
我会用一个char的矢量作为缓冲区。
std::vector<char> buffer(size);
read(input,&buffer[0],size);
基本上,如果你不需要,你甚至不想打电话给你。
向量提供了一个运行时大小的缓冲区,您可以像使用数组(缓冲区)一样使用该缓冲区。
最好的部分是,矢量自行清理后,标准保证矢量中的所有元素都将处于连续存储中。适合缓冲区。
或者更formaly的保证是:
(&buffer[0]) + size == (&buffer[size])
是否有一个很好的理由不使用的std :: string? std :: vector,如其他人所建议的?你在做什么是错误的,但不知道你想要做什么推荐别的东西是困难的。
对于一个非常简单的解决方案,这看起来很复杂。你有什么问题使用
char *c=new char[n]
这里,然后删除它? 或者,如果你需要更多的动态解决方案,
vector<char> c
奥卡姆剃刀,男人。:-)
是的,这是错误的。用一个简单的包装包装。
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]);
自问题提出后几年过去了。
但我打这个页面与搜索,所以我想我也可以注意: 的std ::的unique_ptr,在C++ 11替换auto_ptr的,可以处理新的[]创建的对象的缺失。
有标准::的unique_ptr的两个版本:1)管理的 寿命的单个对象(例如,与新分配)2)管理对象的 动态分配阵列的寿命(例如分配用新的[])
的点是保证删除。使用智能指针/数组是安全的,可以防止正常的编程错误,并且在发生异常时足够聪明以释放内存。直接使用C数组需要内存泄漏。 – Diastrophism 2008-11-04 19:07:19
整点是我们要保证删除。因此解开RAW新不是一个好的答案。 std :: vector另一方面是一个很好的答案 – 2008-11-04 20:59:14