스마트 포인터없이 이중 삭제를 방지하는 방법은 무엇입니까?

가장 큰 _prime_is_463035818

어쩌면 이것은 어리석은 질문일지도 모르지만, 나는 단지 물건을 엉망으로 만들지 않도록하고 싶습니다. 이 구조체가 있다고 가정합니다.

struct Foo{
    struct Bar { virtual int calc(int x) = 0; };
    Bar* barX;
    Bar* barY;
    int x,y;
    Foo(Bar* bx,Bar* by) : barX(by),barY(by) {}
    void process(int xx,int yy){
        x = barX->calc(xx);
        y = barY->calc(yy);
    }
    ~Foo();
};

struct IDBar : Foo::Bar { int calc(int x) { return x; } };

int main() {
    IDBar* b = new IDBar();
    Foo f = Foo(b,b);
    Foo f2 = Foo(new IDBar(),new IDBar());
}

C ++ 11 (즉, 스마트 포인터가 없음)을 사용할 수 없으며 100 % 확실하지 않습니다 ... 이것이 Bar개체를 모두 (또는 하나만) 삭제하는 올바른 방법입니까?

Foo::~Foo(){
    if (barX == barY){ delete barX; }
    else { delete barX; delete barY; }
}

?

추신 : 아이디어는 객체 Foo소유 한다는 것입니다 Bar(따라서 객체를 삭제해야합니다). Bar생성자에 전달 s는 다른 용도로 사용되지 않아야합니다. 실제로는 Bar하나에 만 속할 수 있습니다 Foo(나중에 깨달은 결함이지만 지금은 괜찮습니다). 또한 Foo복사해서는 안됩니다 (명시 적으로 방지해야 할 수도 있습니다).

조던 멜로

나는 Taztingo와 약간의 의견이 일치하지 않습니다. 객체가 전달 된 리소스의 소유권을 가져 오는 것은 부당하지 않습니다. 이것은 모든 종류의 실제 코드에서 발생합니다. 클래스가 생성자에 전달 된 리소스의 소유권을 갖는다는 사실이 문서화되어 있습니다. 누군가가 문서를 참조하지 않고 수업을 부적절하게 사용한다면, 그들은 스스로 총을 쏘는 것입니다.

그러나 이것이 오류가 발생하기 쉬운 것은 사실이며 이러한 종류의 오류를 포착하거나 발생하지 않도록 방지하고자합니다. 다른 사람이 자원을 소유하고 있다고 생각하지 않는다는 것을 보장 할 수있는 방법이 있다면 Foo우리는 계속 될 것입니다. C ++ 11에서는 std::unique_ptr. 이전 C ++ 표준에는 std::auto_ptr. 이전 C ++ 표준에는 이동 생성자가 없지만 할당시 std::auto_ptr리소스를 이전 리소스에서 포기 std::auto_ptr하거나 새 std::auto_ptr.

나는 당신이 사용하는 것이 좋습니다 std::auto_ptr.

클래스의 두 생성자 매개 변수에 대해 동일한 리소스가 명시 적으로 전달 Foo되도록 허용되는 경우 하나만 허용하는 새 생성자를 만듭니다 std::auto_ptr<Bar>.

마지막으로 Foo복사 할 수 없도록 만들려면 복사 생성자와 할당 연산자를 모두 전용으로 선언하면됩니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Algolia 인덱스 / 데이터베이스를 삭제하거나 지우는 방법은 무엇입니까?

분류에서Dev

Riak, 이미 사용중인 인덱스를 삭제하는 방법은 무엇입니까?

분류에서Dev

마스터보기의 항목이 삭제되면 자세히보기 표시를 중지하는 방법은 무엇입니까?

분류에서Dev

실제 카드없이 스마트 카드의 인증서를 사용하는 방법은 무엇입니까?

분류에서Dev

포트 포워딩없이 마인 크래프트 서버를 실행하는 방법은 무엇입니까?

분류에서Dev

Vue 차트 데이터 포인트에서 텍스트를 제거하는 방법은 무엇입니까?

분류에서Dev

Yii2 : 다중 데이터베이스 스키마를 지정하는 방법은 무엇입니까?

분류에서Dev

필드에 없음이 포함 된 마지막 행을 삭제하는 방법은 무엇입니까?

분류에서Dev

데이터베이스에서 삭제가 성공했는지 확인하는 방법은 무엇입니까?

분류에서Dev

Laravel에서 업데이트 한 후 오래된 이미지를 삭제하는 방법은 무엇입니까?

분류에서Dev

Prod에서 잘못된 테스트 데이터를 삭제하는 방법은 무엇입니까?

분류에서Dev

포함 된 슬라이스로 크기가 지정되지 않은 유형에 대한 스마트 포인터를 만드는 방법은 무엇입니까?

분류에서Dev

CCleaner가 인덱싱 데이터를 삭제하는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

Firefox 업데이트를 중지하는 방법은 무엇입니까?

분류에서Dev

ElapsedEventHandler 후 이벤트를 중지하는 방법은 무엇입니까?

분류에서Dev

자동 업데이트를 중지하는 방법은 무엇입니까?

분류에서Dev

중앙선에 데이터 포인트를 반영하는 방법은 무엇입니까?

분류에서Dev

이미지를 어둡게하고 텍스트로 마스크하는 방법은 무엇입니까?

분류에서Dev

패턴 쌍의 마지막 발생 사이에 텍스트를 인쇄하는 방법은 무엇입니까?

분류에서Dev

주어진 값보다 낮은 요소의 삭제를 지원하는 트리 데이터 구조를 디자인하는 방법은 무엇입니까?

분류에서Dev

주어진 값보다 낮은 요소의 삭제를 지원하는 트리 데이터 구조를 디자인하는 방법은 무엇입니까?

분류에서Dev

spark-sql로 하이브 데이터베이스를 삭제하는 방법은 무엇입니까?

분류에서Dev

Firebase 데이터베이스에서 특정 데이터를 삭제하는 방법은 무엇입니까?

분류에서Dev

브라우저에서 "이 스크립트 실행 중지"를 방지하는 방법은 무엇입니까?

분류에서Dev

신속하게 스프라이트 키트 업데이트를 중지하는 방법은 무엇입니까?

분류에서Dev

신속하게 스프라이트 키트 업데이트를 중지하는 방법은 무엇입니까?

분류에서Dev

C에서 구조체없이 중첩 된 이중 포인터를 갖는 방법은 무엇입니까?

분류에서Dev

ISO 이미지 마운트를 해결하는 방법은 무엇입니까?

분류에서Dev

스키마 바이트 벡터에서 외부 원시 바이트 포인터를 검색하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Algolia 인덱스 / 데이터베이스를 삭제하거나 지우는 방법은 무엇입니까?

  2. 2

    Riak, 이미 사용중인 인덱스를 삭제하는 방법은 무엇입니까?

  3. 3

    마스터보기의 항목이 삭제되면 자세히보기 표시를 중지하는 방법은 무엇입니까?

  4. 4

    실제 카드없이 스마트 카드의 인증서를 사용하는 방법은 무엇입니까?

  5. 5

    포트 포워딩없이 마인 크래프트 서버를 실행하는 방법은 무엇입니까?

  6. 6

    Vue 차트 데이터 포인트에서 텍스트를 제거하는 방법은 무엇입니까?

  7. 7

    Yii2 : 다중 데이터베이스 스키마를 지정하는 방법은 무엇입니까?

  8. 8

    필드에 없음이 포함 된 마지막 행을 삭제하는 방법은 무엇입니까?

  9. 9

    데이터베이스에서 삭제가 성공했는지 확인하는 방법은 무엇입니까?

  10. 10

    Laravel에서 업데이트 한 후 오래된 이미지를 삭제하는 방법은 무엇입니까?

  11. 11

    Prod에서 잘못된 테스트 데이터를 삭제하는 방법은 무엇입니까?

  12. 12

    포함 된 슬라이스로 크기가 지정되지 않은 유형에 대한 스마트 포인터를 만드는 방법은 무엇입니까?

  13. 13

    CCleaner가 인덱싱 데이터를 삭제하는 것을 방지하는 방법은 무엇입니까?

  14. 14

    Firefox 업데이트를 중지하는 방법은 무엇입니까?

  15. 15

    ElapsedEventHandler 후 이벤트를 중지하는 방법은 무엇입니까?

  16. 16

    자동 업데이트를 중지하는 방법은 무엇입니까?

  17. 17

    중앙선에 데이터 포인트를 반영하는 방법은 무엇입니까?

  18. 18

    이미지를 어둡게하고 텍스트로 마스크하는 방법은 무엇입니까?

  19. 19

    패턴 쌍의 마지막 발생 사이에 텍스트를 인쇄하는 방법은 무엇입니까?

  20. 20

    주어진 값보다 낮은 요소의 삭제를 지원하는 트리 데이터 구조를 디자인하는 방법은 무엇입니까?

  21. 21

    주어진 값보다 낮은 요소의 삭제를 지원하는 트리 데이터 구조를 디자인하는 방법은 무엇입니까?

  22. 22

    spark-sql로 하이브 데이터베이스를 삭제하는 방법은 무엇입니까?

  23. 23

    Firebase 데이터베이스에서 특정 데이터를 삭제하는 방법은 무엇입니까?

  24. 24

    브라우저에서 "이 스크립트 실행 중지"를 방지하는 방법은 무엇입니까?

  25. 25

    신속하게 스프라이트 키트 업데이트를 중지하는 방법은 무엇입니까?

  26. 26

    신속하게 스프라이트 키트 업데이트를 중지하는 방법은 무엇입니까?

  27. 27

    C에서 구조체없이 중첩 된 이중 포인터를 갖는 방법은 무엇입니까?

  28. 28

    ISO 이미지 마운트를 해결하는 방법은 무엇입니까?

  29. 29

    스키마 바이트 벡터에서 외부 원시 바이트 포인터를 검색하는 방법은 무엇입니까?

뜨겁다태그

보관