我们有两个std::shared_ptr指向对象的指针:
p1, 创建于std::make_shared<>().p2使用 的构造函数创建的std::shared_ptrA。
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
那里有很多信息表明行为p1有些p2不同(make_shared 和普通 shared_ptr 的区别,cppreference 的注释部分等),并且在某些情况下,一种方法比另一种方法有优势。
问题:是否可以在程序执行p1期间p2确定它们是通过std::make_shared构造函数还是通过构造函数创建的?
如果你不能肯定地说,你可以尝试“深入挖掘”并做出有根据的猜测吗?
C++ 标准并不重要(尽管是 C++23),如果特定于编译器的解决方案使任务更容易,那么它也很好。
检查了三个标准库:libstdc++、libc++ 和 MSVC STL。
在这三个方面,它将
make_shared元信息和一个对象存储在一个内存块中(以免调用 new 两次),而手动内存分配不会发生这种情况。在所有这三个上,它
shared_ptr存储两个指针——指向对象和元信息,按顺序。我们获取第二个指针并检查它是否指向位于第一个指针或其他位置的内存块的中间。为此,您需要知道这个块的长度——为此有各种平台相关的函数(我只在 Linux 和 mingw 上通过 wine 进行了检查,没有 poppy)。