我需要创建一个指向std::vector的shared_ptr,正确的语法是什么?
std::vector<uint8_t> mVector;
shared_ptr<std::vector<uint8_t>> mSharedPtr = &mVector;
上面的代码无法编译。
谢谢。
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
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);
std::vector<uint8_t> mVector;
auto mSharedPtr = std::make_shared<std::vector<uint8_t> >(std::move(mVector));
//don't use mVector anymore.
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);
std::make_shared
? - user3920237make_shared
版本始终调用向量复制构造函数。您还可以转发向量的构造函数参数。 - davidhighstd::move
。 - coyotte508&mVector
' 分配给智能指针 'mSharedPtr
',这是两个不同的对象,不允许进行强制转换。shared_ptr
。std::shared_ptr<std::vector<uint8_t>> sPtr (&mVector);
std::shared_ptr<std::vector<uint8_t>> sPtr;
sPtr.reset(&mVector);
std::shared_ptr<std::vector<uint8_t>> sPtr (&mVector,[](std::vector<uint8_t>*){});
auto p = std::make_shared<std::vector<uint8_t>>();
可以翻译为:创建一个类型为std::vector<uint8_t>
的共享指针,使用std::make_shared
函数生成。 - Ferruccio