2

我完全知道,如果我想创建一个指向数组的智能指针,最好的方法是使用

     boost::shared_array<T>( new T[20] );

我不明白的是当这种类型的共享指针超出范围时我遇到的崩溃。

     boost::shared_ptr<T>( new T[20] );

我一直认为上面的代码会造成泄漏,因为它在数组的第一个元素上调用 delete 并保持其他元素不变,但事实并非如此,我有一个分段错误。

你能帮我理解为什么吗?如果我不使用共享指针而是使用普通的香草指针,我的行为最糟糕

       CMyClass *p = new CMyCLass[10];
       ///....do stuff
       delete p;

       *** glibc detected *** ./test: munmap_chunk(): invalid pointer: 0x088eb00c ***
4

4 回答 4

4

你能帮我理解为什么吗?如果我不使用共享指针而是使用普通的香草指针,我的行为最糟糕

因为您的代码具有Undefined Behavior

CMyClass *p = new CMyCLass[10];
///....do stuff
delete []p;
      ^^^^ <-------------that is Missing!

你需要使用delete [].

  1. 如果您分配使用,则new必须使用delete.
  2. 如果您分配使用,则new []必须使用delete []

否则会导致未定义的行为。还有一个是未定义的行为,那么你的程序可能会显示任何行为。它可能会崩溃或工作或其他任何东西(字面意思),所以所有安全的赌注都被取消了。

如何使用自定义解除分配shared_ptr

因为shared_ptr您应该使用自己的自定义删除函数来适当地释放。如果使用 进行数组分配new [],则需要使用delete []. 就像是:

template
class CustomDeleter
{
public:
    void operator () (T* d) const
    {
        delete [] d;
    }
};

int main ()
{
    std::shared_ptr array(new Myclass[256], CustomDeleter());
    return 0;
}
于 2012-05-27T15:24:02.827 回答
2

如果它new编辑了一个元素,它需要是deleted。如果它是new[]ed,它需要是delete[]d。

我怀疑当 shared_ptr 尝试delete代替delete[]元素时会出现您的问题。

于 2012-05-27T15:24:13.407 回答
1

如果您使用分配数组new T[N](),则必须调用delete []以释放它,但您的shared_ptr调用delete会导致错误。最简单的方法是使用boost::shared_array<T>将数组存储在 ref 计数指针中。

于 2012-05-27T15:26:36.603 回答
0

为什么不使用智能指针数组?

于 2012-05-27T16:26:06.597 回答