불완전한 객체 유형에 대한 스마트 포인터로 클래스를 안전하게 파괴하는 방법은 무엇입니까?

닐 커크

스마트 포인터와 함께 불완전한 유형을 사용하고 포인터가 삭제되는 방법에 대해 걱정하고 있습니다. 다음 코드는 안전한가요? main.cpp가 완전한 유형을 보지 못하는 Farm의 기본 소멸자를 생성하기 때문에 나는 그것이 아닐 것이라고 생각합니다. 안전하게 만들려면 완전한 유형을 보는 비 인라인 소멸자를 만들어야한다고 생각합니다. 그 맞습니까?

std::vector<Cow>대신 농장에서 사용해도 똑같 나요?

farm.h

class Cow;

struct Farm
{
    Farm();
    // ~Farm();
    std::unique_ptr<Cow> cow;
};

farm.cpp

#include "cow.h"
// cow now complete

Farm::Farm()
{
    cow.reset(new Cow);
}

// Farm::~Farm() {}

main.cpp

#include "farm.h"

int main()
{
    Farm farm;
}

편집 : 소멸자없이 Visual Studio로 컴파일을 시도했는데 오류 C2338 : 불완전한 형식을 삭제할 수 없습니다. 제 질문에 답이 될 것 같습니다.

스티브 제솝

코드가 컴파일되어야한다고 생각하지 않습니다 (gcc에 포함되어 있지 않음).

std::unique_ptr<Cow>용도 std::default_delete<Cow>std::default_delete<Cow>::operator()불완전한 유형의 인스턴스를 실패합니다 Cow.

참조 그것의 템플릿 유형이 불완전한 유형 인 경우 unique_ptr 선언하는 auto_ptr은 선언과는 달리, 잘 정의 된 것이 사실인가요?

그래서 당신이 옳 습니다. 유형이 완전한 default_delete<Cow>::operator()어딘가에 인스턴스화 되었는지 확인해야합니다 Cow. 이는 소멸자가 Farm그러한 장소에서 정의되어야 함을 의미합니다 .

귀하의 주제가 "스마트 포인터"라고 말하고 질문에는 unique_ptr. 는 전달 된 포인터의 (정적) 유형을 캡처하고 삭제자를 저장하는 함수 템플릿 shared_ptr이므로 대답은 다를 수 있습니다 std::shared_ptr<Cow>::reset(). 따라서 shared_ptr필요한 것은 호출에 reset완전한 유형 이 있다는 것 Cow입니다. 소멸자의 위치는 중요하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관