我应该使用<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?
我正在使用一个代码库,它广泛使用以下语法:
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
分配进行双重分配。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 引用 std::shared:ptr 以避免引用计数
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- 如何控制共享 ptr 引用计数?