boost :: shared_ptr는 정말 저를 괴롭 힙니다. 확실히, 나는 그러한 일의 유용성을 이해하지만 나는 shared_ptr<A>
을으로 A*
으로 사용할 수 있기를 바란다. 다음 코드를 고려하십시오.C++ : 객체에 대한 공유 포인터가 아닌 공유 객체 만들기
class A
{
public:
A() {}
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};
class HelpfulContainer
{
public:
//Don't worry, I'll manager the memory from here.
void eventHorizon(A*& a)
{
cout << "It's too late to save it now!" << endl;
delete a;
a = NULL;
}
};
int main()
{
HelpfulContainer helpfulContainer;
A* a1 = new A(1);
A* a2 = new A(*a1);
cout << "*a1 = " << *a1 << endl;
cout << "*a2 = " << *a2 << endl;
a2->setX(2);
cout << "*a1 = " << *a1 << endl;
cout << "*a2 = " << *a2 << endl;
cout << "Demonstrated here a2 is not connected to a1." << endl;
//hey, I wonder what this event horizon function is.
helpfulContainer.eventHorizon(a1);
cout << "*a1 = " << *a1 << endl;//Bad things happen when running this line.
}
HelpfulContainer를 만든 사람은 누구나 A 개체에 대한 포인터를 보유하려고한다고 생각하지 않았습니다. 우리는 HelpfulClass boost :: shared_ptr 객체를 줄 수는 없습니다.
class SharedA : public A
{
public:
SharedA(A* a) : mImpl(a){}
virtual void setX(int x) {mImpl->setX(x);}
virtual int getX() const {return mImpl->getX();}
private:
boost::shared_ptr<A> mImpl;
};
그리고 주요 기능은 같은 것을 볼 수 있습니다 :하지만 우리가 할 수있는 한 가지는 A 인 자체 SharedA를 만들 pimlp 관용구를 사용하고, 그래서
int main()
{
HelpfulContainer helpfulContainer;
A* sa1 = new SharedA(new A(1));
A* sa2 = new SharedA(sa1);
cout << "*sa1 = " << *sa1 << endl;
cout << "*sa2 = " << *sa2 << endl;
sa2->setX(2);
cout << "*sa1 = " << *sa1 << endl;
cout << "*sa2 = " << *sa2 << endl;
cout << "this demonstrates that sa2 is a shared version of sa1" << endl;
helpfulContainer.eventHorizon(sa1);
sa2->setX(3);
//cout << "*sa1 = " << *sa1 << endl;//Bad things would happen here
cout << "*sa2 = " << *sa2 << endl;
//but this line indicates that the originally created A is still safe and intact.
//only when we call sa2 goes out of scope will the A be deleted.
}
을 내 질문은 이것이다 : 위 패턴은 좋은 패턴인가, 아니면 내가 아직 고려하지 않은 것이있다. 내 현재 프로젝트는 내가 필요로하는 포인터를 삭제하는 위의 HelpfulContainer
클래스를 상속 받았지만 여전히 HelpfulContainer에있는 데이터 구조가 필요합니다.
업데이트 :이 question은 후속 질문입니다.
HelpfulContainer가 포인터의 소유권을 가져 오려면 올바른 의미 체계를 사용해야합니다. 'eventHorizon' 인터페이스는 어떤 일이 일어나고 있는지 설명하지 않고, 소유권이 이전되고 있음을 나타내야합니다 (std :: auto_ptr 또는 새로운 대체 std :: unique_ptr). 이 두 가지 모두 HelpfullContainer 객체가 객체의 소유권을 가져오고 있으므로 호출 후에 더 이상 유효하지 않음을 나타냅니다. 그래서 당신은 C++ 코드가 언어의 의미를 이해하지 못하는 사람들에 의해 심하게 쓰여질 수 있다는 점을 증명합니다. –