我使用std :: function和std :: bind作为我的异步线程回调系统。 但有时我的系统会删除我的对象,即使某些线程没有完成。 这里有一些示例代码
#include <iostream>
#include <functional>
using namespace std;
class Character {
public:
Character() { a = 10; }
void Print() { cout << a << endl; }
private:
int a;
};
void main() {
Character* pChar = new Character();
std::function<void()> callback = std::bind(&Character::Print, pChar);
callback(); // it's fine
delete pChar;
callback(); // fail
if (callback) // this if doesn't work
callback();
// i want to check callback is still available
}
请帮我这样做。
答案 0 :(得分:6)
您可以使用std::weak_ptr
代替原始指针,例如:
void safePrint(std::weak_ptr<Character> w)
{
auto pChar = w.lock();
if (pChar) {
pChar->Print();
}
}
int main() {
auto pChar = make_shared<Character>();
auto callback = std::bind(&safePrint, std::weak_ptr<Character>(pChar));
callback(); // it's fine
pChar.reset();
callback(); // won't print, and don't crash :)
}
答案 1 :(得分:-1)
这是因为您要删除std::underlying_type
方法中使用的pChar*
指针。完成所有事情后删除callback()
。