Android`binder_interface_utils.h`中的`SharedRefBase'中重载'new'和'delete'的目的,以及`std::make_shared`的问题

问题描述 投票:0回答:1

在 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) {
            ...
        }
       ...
    }

非常感谢您的任何意见。谢谢!

android c++
1个回答
0
投票

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 托管对象的内存碎片。但这只是我怀疑的事情。

© www.soinside.com 2019 - 2024. All rights reserved.