如何创建一个到std :: vector的shared_ptr?

时间:2014-11-04 11:50:22

标签: c++ c++11

我需要为std :: vector创建一个shared_ptr,正确的语法是什么?

std::vector<uint8_t> mVector;
shared_ptr<std::vector<uint8_t>> mSharedPtr = &mVector;

上面的代码无法编译。

感谢。

3 个答案:

答案 0 :(得分:19)

您要做的是让智能指针管理堆栈对象。这不起作用,因为堆栈对象在超出范围时会自行终止。智能指针不能阻止它这样做。

std::shared_ptr<std::vector<uint8_t> > sp;
{
   std::vector<uint8_t> mVector;
   sp=std::shared_ptr<std::vector<uint8_t> >(&mVector);
}
sp->empty();   // dangling reference, as mVector is already destroyed

三种选择:

(1)初始化向量并让它由shared_ptr

管理
auto mSharedPtr = std::make_shared<std::vector<uint8_t> >(/* vector constructor arguments*/);


(2)管理向量的副本(通过调用向量复制构造函数):

std::vector<uint8_t> mVector;
auto mSharedPtr = std::make_shared<std::vector<uint8_t> >(mVector);


(3)移动向量(通过调用向量移动构造函数):

std::vector<uint8_t> mVector;
auto mSharedPtr = std::make_shared<std::vector<uint8_t> >(std::move(mVector));
//don't use mVector anymore.

答案 1 :(得分:5)

首先,你所做的是非常错误的,如果你给一个指向shared_ptr的指针,确保它是用new动态分配的,而不是在堆栈上。否则你也可以使用指针而不是shared_ptr。

您的代码应为:

std::vector<uint8_t> mVector;
/* Copy the vector in a shared pointer */
std::shared_ptr<std::vector<uint8_t> > mSharedPtr ( new std::vector<uint8_t>(mVector) );

或:

std::shared_ptr<std::vector<uint8_t> > mSharedPtr ( new std::vector<uint8_t>() );

至于为什么它不编译,你需要使用构造函数,而不是=运算符。

正如@remyabel所指出的,make_shared效率更高:

std::vector<uint8_t> vector;
/* Copy the vector in a shared pointer */
auto sharedPtr = std::make_shared<std::vector<uint8_t>> (vector);

答案 2 :(得分:0)

您的代码无法编译,因为您正在将原始指针'&mVector'分配给智能指针'mSharedPtr',这是两个不同的对象,并且不允许强制转换。

您可以通过其他方法实现

(1)从头开始使用原始指针初始化shared_ptr

std::shared_ptr<std::vector<uint8_t>> sPtr (&mVector);

(2)使用reset()的{​​{1}}方法

shared_ptr

将堆栈对象原始指针分配给智能指针,还应该为智能指针提供一个空的删除器,以使智能指针在对象仍位于堆栈上时也不会删除该对象。

std::shared_ptr<std::vector<uint8_t>> sPtr;
sPtr.reset(&mVector);