문제는 원시 포인터에서 shared_ptr
을 암시 적으로 생성하려고하는 것입니다. 당신은 당신의지도 이런 식으로 초기화 할 수 있습니다
const map<int, shared_ptr<A>> mymap = {
{1, shared_ptr<B>(new B())},
{2, shared_ptr<C>(new C())}
};
단락 원시 포인터를 수락 C++ 11 개 표준 요구 shared_ptr<>
의 생성자 20.7.2.2 explicit
될 수 있습니다 :
template<typename Y> explicit shared_ptr(Y* p);
문제 두 번째 인수로 pair<>
의 생성자에 원시 포인터를 전달하여 std::pair<int, shared_ptr<A>>
의 인스턴스를 생성하려고 시도하는 것입니다.이 생성자는 shared_ptr<A>
을 허용합니다. 기본적으로,이 같은 수 있습니다 :
pair<int, shared_ptr<A>> mymap(1, new B()); // ERROR!
pair<int, shared_ptr<A>> mymap(1, shared_ptr<B>(new B())); // OK
이것은 당신이 그렇지 않으면 할 수있는 아주 좋은 이유가 당신이 정말 당신이 무엇을하고 있는지 알지 못한다면, 말은 모두 있기 때문에, 공유 포인터를 만들 std::make_shared<>()
를 사용하는 것이 더 좋다 (2 개 대신 하나의 메모리 할당을 수행함) 및 예외 안전성 (B
또는 C
의 생성자가 예외를 throw하면 누출되지 않음). 따라서 맵 초기화는 다음과 같아야합니다.
const map<int, shared_ptr<A>> mymap = {
{1, make_shared<B>()},
{2, make_shared<C>()}
};
사용했던 컴파일러와 사용한 컴파일러 및 수행 한 작업을 보여주는 완전한 소형 프로그램을 포함하십시오. –