2008-11-04 63 views

回答

19

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

如果您不需要传输指针的所有权,那么Boost的scoped_array类可能就是您要查找的内容。

6

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

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

10

我会用一个char的矢量作为缓冲区。

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

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

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

最好的部分是,矢量自行清理后,标准保证矢量中的所有元素都将处于连续存储中。适合缓冲区。

或者更formaly的保证是:

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

是否有一个很好的理由不使用的std :: string? std :: vector,如其他人所建议的?你在做什么是错误的,但不知道你想要做什么推荐别的东西是困难的。

0

对于一个非常简单的解决方案,这看起来很复杂。你有什么问题使用

char *c=new char[n] 

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

vector<char> c 

奥卡姆剃刀,男人。:-)

+1

的点是保证删除。使用智能指针/数组是安全的,可以防止正常的编程错误,并且在发生异常时足够聪明以释放内存。直接使用C数组需要内存泄漏。 – Diastrophism 2008-11-04 19:07:19

+1

整点是我们要保证删除。因此解开RAW新不是一个好的答案。 std :: vector另一方面是一个很好的答案 – 2008-11-04 20:59:14

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]); 
2

自问题提出后几年过去了。

但我打这个页面与搜索,所以我想我也可以注意: 的std ::的unique_ptr,在C++ 11替换auto_ptr的,可以处理新的[]创建的对象的缺失。

有标准::的unique_ptr的两个版本:1)管理的 寿命的单个对象(例如,与新分配)2)管理对象的 动态分配阵列的寿命(例如分配用新的[])

cppreference unique_ptr