日常怀疑自己真的会写cpp?

1
2
3
4
5
6
7
8
9
10
struct A {
void func() {
// only have "this" ptr ?
}
};

int main() {
A* a;
std::shared_ptr<A> sp_a(a);
}

当A* a被shared_ptr托管的时候,如何在func获取自身的shared_ptr成了问题.
如果写成:

1
2
3
4
void func() {
std::shared_ptr<A> local_sp_a(this);
// do something with local_sp_a
}

又用a新生成了一个shared_ptr: local_sp_a, 这个在生命周期结束的时候可能将a直接释放掉.

这里就需要用enable_shared_from_this改写:

1
2
3
4
5
6
struct A : public enable_shared_from_this {
void func() {
std::shared_ptr<A> local_sp_a = shared_from_this();
// do something with local_sp
}
};

shared_from_this会从weak_ptr安全的生成一个自身的shared_ptr.