2014-11-04 2 views

답변

2

먼저 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); 
+12

왜'표준 : make_shared'? –

+0

예 make_shared가 더 효율적입니다. –

+0

또한 예외가 발생하는 동안 메모리 누수에 대한 보호 기능을 제공합니다. –

14

스마트 포인터가 스택 객체를 관리 할 수 ​​있도록하는 것입니다

으로는 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. 

관련 문제