이 코드 고려 : 때때로호출 표준 : : 함수 객체
#include <iostream>
#include <functional>
using namespace std;
using namespace std::placeholders;
typedef function<void(const int&)> SomeFunc;
class X {
public:
X(string name):name_(name)
{ cout << "ctor " << name_ << endl; }
~X()
{
cout << "dtor " << name_ << endl;
name_ = "empty";
}
SomeFunc
getSomeFunc()
{ return bind(&X::someMethod, this, _1); }
private:
string name_;
void
someMethod(const int& a)
{
cout << name_ << " some method with " << a << endl;
}
};
int main()
{
SomeFunc f;
{
shared_ptr<X> x(new X("Object"));
f = x->getSomeFunc();
f(1);
}
f(2);
return 0;
}
을, 출력은 저에게이 제공 :
ctor Object
Object some method with 1
dtor Object
empty some method with 2
다른 시간이 :
ctor Object
Object some method with 1
dtor Object
some method with 2
현실 세계에서는 할당 취소 된 객체가 속성에 액세스하려고하면 충돌이 발생합니다. 여기에 질문이 있습니다. 함수가 가리키는 대상에 대한 참조를 유지하는 것을 보장하지 않기 때문에 참조 된 개체가 이미 할당 취소 된 후에 함수가 호출 될 때 충돌을 피하는 것이 가장 좋습니다.
내가 생각할 수있는 해결책 중 하나 - 객체 내부에 특수 플래그 bool deallocated_
을 유지하고 할당 해제 후 호출 될 수있는 메소드 내부에서 확인하십시오. 그러나, 나는 그것이 신뢰할 수 없다고 생각한다. (주석에서)
업데이트 :
내가이 해결 방법을 필요로하는 진짜 이유를 매개 변수로 기능을 걸리는 라이브러리입니다. 이 라이브러리는 비동기 적으로 작동하며 전달 된 함수 객체를 제어하지 못합니다. 그래서 내 객체가 할당 해제되면 라이브러리는 여전히 충돌로 이어지는 원래 전달 된 함수를 사용하여 콜백을 호출 할 수 있습니다.
귀여운 대답은 "어리석은 짓하지 마라."입니다. – BlamKiwi
음, 매달려있는 포인터를 사용하면 얻는 것을 얻을 수 있습니다. 당신의 진정한 질문은 무엇입니까? 소유권을 더 잘 관리하는 방법을 묻는다면 소유권을 더 잘 관리하는 것이 해결책입니다. –
나는 다른 요일에 이것을 물었다 : http://stackoverflow.com/questions/28054303/stdfunction-to-member-function-of-object-and-lifetime-of-object 아마 도움이 될 것이다. –