【发布时间】:2018-03-18 18:27:54
【问题描述】:
要分配一个 char* 数组,我通常会这样写:
char* arr = new char[size];
如何使用 boost::shared_ptr(或者可能是 boost::shared_array)和 boost::make_shared 实现相同的目标?
我的猜测是:
1) boost::shared_ptr<char[]> arr = boost::make_shared<char[]>(size);
2) boost::shared_ptr<char> arr = boost::make_shared<char>(size);
3) boost::shared_ptr<char> arr = boost::shared_ptr<char>(new char[size]);
最后一个看起来是对的,但它保证在销毁时会调用 delete [] arr 吗?
【问题讨论】:
-
您的问题是关于分配“char* 数组”,但您真正想要的是 char 数组。你真的想要一个指针数组吗? (一旦你意识到,3 显然是错误的。它会创建一个智能指针,其类型表示它指向
char,而不是任何东西的数组。 -
所以正确的是 1) ?我认为 3 由于 new char[size] 声明了一个指向数组的指针。换句话说,我希望它是指向数组第一个字符的指针,后跟 size-1 字符。
-
但是你想要的是一个指向数组的智能指针,它指向数组中的第一个字符。您不想要一个指向恰好指向数组中第一个字符的字符的智能指针。所以 type 是错误的,即使它指向正确的东西。
-
好吧 1) 是正确的吗?而当对象被破坏时,delete[] arr 会被调用 not delete arr 对吧?
-
支持记录在here。不能保证会专门使用
delete[](如果您考虑一下,那将是低效的,因为您需要一个单独的对象来保存返回的值),但是这些对象将被正确破坏并释放内存。
标签: c++ boost shared-ptr smart-pointers make-shared