std :: vector에 shared_ptr을 만들어야합니다. 올바른 구문은 무엇입니까?std :: vector에 shared_ptr을 만들려면 어떻게해야합니까?
std::vector<uint8_t> mVector;
shared_ptr<std::vector<uint8_t>> mSharedPtr = &mVector;
위의 코드는 컴파일되지 않습니다.
감사합니다.
std :: vector에 shared_ptr을 만들어야합니다. 올바른 구문은 무엇입니까?std :: vector에 shared_ptr을 만들려면 어떻게해야합니까?
std::vector<uint8_t> mVector;
shared_ptr<std::vector<uint8_t>> mSharedPtr = &mVector;
위의 코드는 컴파일되지 않습니다.
감사합니다.
먼저 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>());
가 컴파일되지 않는 이유에 관해서는, 당신은 생성자가 아닌 =
연산자를 사용합니다. 당신이 뭘 하려는지
std::vector<uint8_t> vector;
/* Copy the vector in a shared pointer */
auto sharedPtr = std::make_shared<std::vector<uint8_t>> (vector);
왜'표준 : make_shared'? –
예 make_shared가 더 효율적입니다. –
또한 예외가 발생하는 동안 메모리 누수에 대한 보호 기능을 제공합니다. –
스마트 포인터가 스택 객체를 관리 할 수 있도록하는 것입니다
으로는 make_shared이 더 효율적입니다, @remyabel에 의해 지적했다. 이것은 스택 객체가 범위를 벗어날 때 스스로를 죽이기 때문에 작동하지 않습니다. 스마트 포인터가이를 방지 할 수는 없습니다.
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.
'자동 P = 표준 : : make_shared <표준 : : 벡터>(); ' –
Ferruccio