2013-03-18 3 views
2

는 왜 이런 식으로 복사 생성자를 구현할 수 없습니다, 제대로 작성 일반적으로 배열)복사 생성자 내에 동적으로 할당 된 클래스의 복사 생성자를 호출합니까?</p>이 <pre><code>MyClass::MyClass(const MyClass &other) { this->value = new Value(*(other.value)); } </code></pre> <p>내가 보는 대부분의 예제,이 작업을 수행 : (그들은이기 때문에 생성자, 소멸자, 대입 연산자를 가정

MyClass::MyClass(const MyClass &other) 
{ 
    Value *temp = new Value; 
    *temp = *(other.value); 
    this->value = temp; 
} 

그러나 첫 번째 예에서 다루는 '새'가 발생하는 경우, 영향을받지 않습니다,과 가치의 복사 생성자가 발생하는 경우, 할당 된 메모리를 '새로운'해제하지 않습니다 '기타'가 예외를 전파하기 전에?

이것은 미니 스마트 포인터 자체를위한 것이기 때문에 특별히 std :: unique_ptr 및 다른 스마트 포인터를 사용하지 않아야합니다.

+0

왜'동적으로 처음에 할당 된 값 '된다 std::unique_ptr 원하는 의미를 가지고 있으며, make_unique 도우미가 아주 쉽게 그것을 만드는 것 같습니다? 높은 가치를 지니고 값 의미를 부여하려고 시도하고 잘못 했습니까? – sehe

+0

값은 다른 클래스에 대한 포인터입니다. 아마도 'Value'라는 이름이 잘못된 단어 였을 것입니다. 더 일반적인 'Data'또는 'OtherClass'를 사용해야했습니다. 그리고 내가 "잘못하고있는 것"이라면, 나는 그것이 올바른지 아닌지를 알지 못하기 때문에 내가 질문을하는 이유입니다. –

+0

그래서 왜 포인터입니까? 'MyClass'를 복사하는 것이'value'를 복사하는 것을 의미한다면, 그것은 단순히 값 집계입니다. – sehe

답변

1

열거하기 시작하는 데 너무 많은 문제가 있습니다. 난 당신이 세 가지의 규칙 배울 것이 좋습니다

내가 말했듯이, 가능성이

struct MyClass 
{ 
    MyClass(const MyClass &other) : value(other.value) {} 

    private: 
    OtherClass value; 
}; 

그리고 value 경우

자원의 일종 읽을 것입니다 여기에 적절한 솔루션을 그 이 힙에 살고 있어야합니다. 그러면

로 선언됩니다.3210

그런 식으로는 소유권 의미 및 메모리 관리를 잘못 (쉽게, 쉽게) 할 수 없습니다.

+0

저는 이해하지 못했던 세 가지 규칙의 일부에 대해 질문하고 있습니다. 나는 원래 질문에서 그것을 언급했다. 제공 std :: unique_ptr 좋은 제안이지만! 그러나 나는이 상황에서 그것을 특별히 피하고 있습니다. –

2

값의 복사 생성자가 throw하는 경우 예외를 전파하기 전에 할당 된 메모리를 해제하지 않겠습니까?

예.

세 줄 할당 버전 대신 한 줄 방법을 사용하지 않는 특별한 이유는 없습니다. 당신이 적용되지 않습니다 다음 스마트 포인터를 쓰고있어 이후


하지만, 정규 과목에 당신은 아마 RAII 타입으로 수동 포인터 관리를 마무리한다.

#include <memory> 

// probably will be added to the standard 
template<typename T, typename... Args> 
std::unique_ptr<T> make_unique(Args &&... args) { 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

class Value {}; 

class MyClass { 
    std::unique_ptr<Value> value; 

public: 
    MyClass() : value{make_unique<Value>()} {} 

    MyClass(MyClass const &other) : value{make_unique<Value>(*other.value)} {} 

    MyClass &operator= (MyClass const &other) { 
     value = make_unique<Value>(*other.value); 
     return *this; 
    } 
    // you can also implement assignment from rvalue ref as an optimization 
}; 
+0

네, '다른'은 영향을받지 않을 것이라고 말한 const입니다. 그 부분은 질문이 아니라 진술이었습니다. =) 실제 질문에 답변 해 주셔서 감사합니다! 나는 make_unique 도우미를 이미 가지고 있고, std :: unique_ptr과 std :: shared_ptr을 보통 사용한다. 나는이 특정 클래스에 대해 특별히 피하고있다. 죄송합니다. –