2016-09-23 1 views
1

이 코드는 컴파일되지 않지만 코드에 무엇이 잘못되었는지 알 수 없습니다. 나는 shared_ptr이 중요하다고 생각한다.순수 가상 기본 클래스와 shared_ptr을 사용하는 코드의 문제점

#include <memory> 
#include <iostream> 
using namespace std; 

class A { 
public: 
    virtual const void test() const = 0; 
    ~A() { } 
}; 
class AImpl : public A { 
public: 
    const void test() const { 
    std::cout << "AImpl.test" << std::endl; 
    } 
}; 
class B { 
public: 
    B() { } 
    ~B() { 
    } 

    shared_ptr<A> CreateA() { 
    a_ = make_shared<AImpl>(new AImpl()); 
    return a_; 
    } 
private: 
    shared_ptr<A> a_; 
}; 

int main() { 

    B *b = new B(); 
    shared_ptr<A> p = b->CreateA(); 
    if (b) { 
    delete b; 
    b = NULL; 
    } 
} 
+0

는 개발자를위한, 개발자, 개발자의 거룩한 구절을위한 컴파일러를 듣습니다. 컴파일러 출력은 무엇입니까? – PnotNP

답변

1

make_shared을 잘못 사용 중입니다. make_sharednew을 사용할 필요가 없으므로이 함수 템플릿의 전체 목적을 상실합니다.

이 기능

는 일반적으로 새의 호출에 의해 반환 된 원시 포인터에서 공유 포인터의 건설 표준 : : shared_ptr의을 (새로운 T (인수 ...)) 대체하는 데 사용됩니다. 이 표현식과는 달리 std :: make_shared는 일반적으로 T 객체에 대해 메모리를 할당하고 은 단일 메모리 (std :: shared_ptr의 제어 블록)에 할당합니다 (표준에서 비 구속 요구 사항 임). std :: shared_ptr (new T (args ...))는 최소 두 개의 메모리 할당을 수행합니다.

a_ = make_shared<AImpl>(); // correct 
//a_ = make_shared<AImpl>(new AImpl()); // not correct 
+0

감사합니다. 그것은 많은 도움이됩니다. –

+0

@LiZhang 도움이 되었다면 답을 옆에있는 체크 표시를 클릭하여 답변으로 받아 들일 수 있습니다. – PnotNP