我应该使用<Object> shared_ptr myObject = (shared_ptr) <Object>new Object() 来访问私有构造函数吗?

Should I use shared_ptr<Object> myObject = (shared_ptr<Object>) new Object() to access private constructors?

本文关键字:Object ptr shared gt lt 构造函数 访问 myObject 我应该 new      更新时间:2023-10-16

我正在使用一个代码库,它广泛使用以下语法:

shared_ptr<Object> myObject = (shared_ptr<Object>) new Object();

我注意到我无法使用make_shared访问私有构造函数,但shared_ptr<Object> myObject = (shared_ptr<Object>) new Object();工作正常。我应该仅仅因为它似乎有效而使用它吗?有什么危险吗?它与make_shared有何不同?

我知道这个问题的答案,它将make_shared

std::shared_ptr<Object> p2(new Object("foo"));

但我无法找到对我遇到的语法的引用。是不一样,还是和上面一样?

make_shared

将对象分配到与控制块相同的内存块中。 这提高了缓存一致性并减少了分配。

允许make_shared执行此操作的一种方法是在类中拥有一个私有令牌,以及使用该令牌的公共构造函数

class Object {
private:
struct token_t{ private: token_t() {}; friend class Object; };
static token_t token() { return {}; }
Object() = default;
public:
Object( token_t ):Object() {}
};

现在我们可以make_shared<Object>( Object::token() ).

这给了我们一个分配,并且不会侵犯构造的隐私,因为只有有权访问Object私有字段的东西才能调用该构造函数。 但是,他们可以将令牌传递给另一个函数(如make_shared),然后它可以调用有问题的构造函数。 这自然适用于更多的论点。

至于你的语法:

std::shared_ptr<Object> myObject = (std::shared_ptr<Object>) new Object();

(std::shared_ptr<Object>) new Object();只是从new Object()显式构造shared_ptr<Object>。 它相当于std::shared_ptr<Object>(new Object).

然后,我们采用这个 prvalue 并从中构建myObject。 在 C++03 11 和 14 中,省略了此复制/移动构造。 在第 C++17 中,"施工说明"一词直接适用于myObject。 在实践中,这会产生相同的机器代码(除非你是个傻瓜并明确告诉你的编译器不要 elide 构造)。

简而言之,它有效。 唯一的缺点是将单独的控制块与Object分配进行双重分配。