在 Android 代码库中,特别是在
binder_interface_utils.h
文件中,我注意到 new
和 delete
运算符在 SharedRefBase
类中重载。有人可以提供一些关于为什么会出现这种情况的见解吗?
此外,在创建
std::shared_ptr
的SharedRefBase
时,似乎必须使用make
本身提供的内部SharedRefBase
函数,而不是std::make_shared
。当我尝试使用 std::make_shared
时,它导致 Android 12 上的释放期间崩溃。您能否提供一些解释为什么 std::make_shared
会引发此问题?
以下是相关代码片段供参考:
class SharedRefBase {
...
static void operator new(size_t s) { return std::malloc(s); }
static void operator delete(void p) { std::free(p); }
...
template
static std::shared_ptr make(Args&&... args) {
...
}
...
}
非常感谢您的任何意见。谢谢!
SharedRefBase
有一个伪 shared_from_this
实现。
这需要控制
shared_ptr
的创建方式,因为在构造shared_ptr
期间,必须存储weak_ptr
的逻辑等价物。
在
std
中,这最终会修改 make_shared
以及 shared_ptr
cobtruft-from-pointer 代码,以将 weak_ptr
等效项注入到 shared_from_this
派生类中。
由于
SharedRefBase
不是 std
库的一部分,并且 std
库不公开自定义挂钩以在 weak_ptr
构造期间注入 shared_ptr
等效状态,因此您必须使用其 shared_ptr
构造方法(静态 make
或 ref
方法)来构建 shared_ptr
。
为什么它不使用
shared_from_this
是我不知道的事情。
我怀疑基于 new/delete 运算符重载,它实际上存储了对象旁边的
shared_ptr
状态的信息,从而阻止了使用该基类的共享 ptr 托管对象的内存碎片。但这只是我怀疑的事情。