我需要为std :: vector创建一个shared_ptr,正确的语法是什么?
std::vector<uint8_t> mVector;
shared_ptr<std::vector<uint8_t>> mSharedPtr = &mVector;
上面的代码无法编译。
感谢。
答案 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);