SDL을 사용하여 취미로 2D 게임 엔진을 프로그래밍하는 동안 현재 C++ 11 스마트 포인터를 사용하는 방법을 배우고 있습니다. 그러나 SDL에 대한 OOp 래퍼를 구현하는 동안 문제가 발생했습니다.싱글 톤에 대한 공유 포인터가 서로 인식하지 못합니다.
의도는 SDL이 생성 될 때 초기화하고 SDL이 소멸 될 때 SDL을 종료하는 싱글 톤 클래스를 만드는 것입니다. 싱글 톤 클래스는 을 싱글 톤으로 반환하는 정적 메소드 getInstance
을 가지며, 인스턴스가 없으면 단일 인스턴스를 구성합니다. 싱글 톤의 모든 클라이언트는 자신에게 shared_ptr
을 소유하고, 모든 클라이언트가 파괴되면 singleton 또한 파괴되었다. 싱글 톤 (및 다른 전역 변수)은 일반적으로 좋지 않다고 생각하지만 싱글 톤이 적합한 몇 가지 경우 중 하나 일 수 있습니다. 사용중인 SDL 라이브러리가 하나 밖에 없기 때문에 가능합니다.
getInstance
메서드에서 shared_ptr
을 반환하는 데 문제가 있습니다. 동일한 shared_ptr
관리자 개체를 사용하는 대신 shared_ptr
인스턴스는 관련이 없으며 단일 인스턴스를 삭제하면 해당 단일 개체가 할당 취소됩니다.
#include <iostream>
#include <memory>
using namespace std;
class Foo
{
public:
~Foo(){cout << "Foo <" << this << "> destroyed\n"; instance_ = nullptr;}
static shared_ptr<Foo> getInstance()
{
if(instance_ == nullptr)
instance_ = new Foo;
//problem: the shared pointers created are unaware of each other
return shared_ptr<Foo>(instance_);
}
private:
Foo(){cout << "Foo <" << this << "> constructed\n";}
Foo(Foo& other){}
void operator=(Foo& other){}
static Foo* instance_;
};
Foo* Foo::instance_ = nullptr;
int main()
{
shared_ptr<Foo> a = Foo::getInstance();
shared_ptr<Foo> b = Foo::getInstance();
shared_ptr<Foo> c = Foo::getInstance();
}
출력 :
Foo <0x3e2a10> constructed
Foo <0x3e2a10> destroyed
Foo <0x3e2a10> destroyed
Foo <0x3e2a10> destroyed
@DyP 아, 같은 해결책. 나는 단지 궁금해 : 왜 당신은 대답하지 않았어? –
@DanielFrey OP의 문제가 어디서 왔는지 설명하지 않기 때문에 – dyp
'shared_ptr'은 근본적으로 잘못되었습니다. 당신은 작동하게 만들 수는 있지만 여전히 잘못되었습니다 :'shared_ptr'은 * shared ownership *을 부여합니다.그러나 싱글 톤은 소유권을 공유하지 않으며, 하나의 소유자 (해당 클래스의 컨텍스트 (예 : 스레드))와 해당 소유 인스턴스의 여러 소비자를 갖습니다. 다시 말해 : weak_ptr 또는 원시 포인터를 반환합니다. 아니면 제대로하고 * 포인터를 반환하지 * 참조. 여기에 포인터를 사용하는 것은 쓸모가 없습니다. –