Containing 클래스, Contained 클래스 및 Data 클래스가 있습니다. Containing 클래스에는 Contained 객체의 벡터가 있습니다. Contained 클래스는 Contained 생성자의 힙에 할당 된 데이터 개체에 대한 포인터를 보유합니다. 그러나 소멸자에서 할당을 해제 할 수는 없습니다. 벡터가 Contained의 복사본을 만든 다음 파괴하여 사용중인 복사본에서도 데이터 포인터를 파괴하기 때문입니다.
TL; DR 설명 할 코드는 다음과 같습니다.
class Data {
public:
Data();
};
class Contained {
private:
Data* data;
public:
Contained();
// what should I add ? a copy constructor ? an assignement operator ? and how
};
class Container {
private:
vector<Contained> rooms;
public:
//some member functions
};
Contained::Contained() {
data = new Data();
}
데이터는 어디에서 삭제합니까?
Contained
클래스에 소멸자를 추가합니다 .
Contained::~Contained() {
delete data;
}
이렇게하면 포함 된 개체가 범위를 벗어날 때마다 해당 data
포인터 가 자동으로 삭제됩니다 . 그래서 만약 당신이
//delete first element
rooms.erase(rooms.begin());
data
해당 개체의 ptr이 자동으로 삭제됩니다.
사용 std::unique_ptr<T>
.
class Contained {
private:
std::unique_ptr<Data> data;
public:
Contained();
// what should I add ? a copy constructor ? an assignement operator ? and how
};
그리고 생성자에서 :
Contained::Contained() {
data = std::make_unique<Data>();
}
스마트 포인터 (예 : ( unique_ptr
, shared_ptr
))를 사용하면 아무도 포인터를 소유하지 않을 때 포인터가 자동으로 삭제됩니다. 복사는 할 수없고 unique_ptr
이동 만 가능하므로 Contained
클래스 에 이동 생성자와 이동 할당 연산자를 정의해야합니다 .
Contained::Contained(Contained&& other)
: data(std::move(other.data))
{}
Contained& operator=(Contained&& rhs) {
if (this != &other) {
data = std::move(rhs.data);
}
return *this;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다