클래스와 같은 부스트 신호를 작성하려고합니다 (C++을 배우기위한 연습으로). 그리고 내가 enable_shared_from_this
을 사용할 때, 나는 항상 소멸자에서 충돌을 발견했습니다. 다음은 코드입니다 (vs2012 업데이트 2를 사용하고 있습니다) :std :: enable_shared_from_this를 사용할 때 소멸자에서 크래시가 발생했습니다.
이 모든 의견이 있으십니까? 이 문제는 signal_connection::disconnect
의 줄 (auto this_ = shared_from_this();
)의 주석을 제거 할 때 모든 것이 정상적으로 작동하므로 shared_from_this()
이 발생해야합니다.
shared_from_this()
을 호출하기 전에 적어도 하나의 유효한 shared_ptr이 있어야한다는 것을 알고 있습니다. 내 코드가이를 만족해야합니다.
코드는 :
#include <memory>
#include <map>
class slot_manager;
class signal_connection: public std::enable_shared_from_this<signal_connection>
{
public:
signal_connection(slot_manager* manager)
:manager_(manager)
{}
public:
void disconnect() ;
private:
slot_manager* manager_;
};
class slot_manager
{
public:
typedef std::shared_ptr<signal_connection> connection_type;
typedef std::map<connection_type, int> map_type;
typedef map_type::value_type map_value_type;
public:
void connect(int slot)
{
std::shared_ptr<signal_connection> c(new signal_connection(this));
slots_.insert(map_value_type(c, slot));
}
~slot_manager()
{
auto iter = slots_.begin();
map_type::iterator iter2 = slots_.end();
while (iter != slots_.end())
{
iter2 = iter++;
iter2->first->disconnect();
}
}
void disconnect(std::shared_ptr<signal_connection> connection)
{
auto c = slots_.find(connection);
if (c != slots_.end())
{
slots_.erase(c);
}
}
protected:
map_type slots_;
};
void signal_connection::disconnect()
{
if (manager_ != nullptr)
{
//auto this_ = shared_from_this();
manager_->disconnect(shared_from_this());
manager_ = nullptr;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
slot_manager x;
x.connect(1);
return 0;
}
@KerrekSB : 당신은 공손한 프로그래머가 공개적으로 알몸으로 가지 않는다는 것을 의미합니까? 포장 된 것만? :) – Xeo
나는'make_shared'를'new'로 선호합니다. 그러나 그것은 어떤 문제의 원인이 아닙니다. – aschepler
valgrind는 Mac OS에서이 문제를 즉시 발견했습니다. 프로그램이 중단되지는 않았지만. 그것을 사용하십시오, 그것을 좋아하십시오 : valgrind. –