在构造函数中使用 unique_ptr

Posted

技术标签:

【中文标题】在构造函数中使用 unique_ptr【英文标题】:using unique_ptr in constructor 【发布时间】:2018-08-31 11:14:03 【问题描述】:

我正在做一个学校项目,但我无法弄清楚 unique_ptr 的用法。

class ClassName

private: 
    unique_ptr <bool[]> uniquePtr;

    void func(unique_ptr<bool[]>& refPtr) const
        
            refPtr[0] = true;
            refPtr[1] = false; 
        
public:
    //other things that will use the array uniquePtr
;

ClassName::ClassName()

    bool* boolName = new bool [someSize()];
    uniquePtr = unique_ptr<bool[]>(boolName);
    func(uniquePtr);
    for(int i =0; i<someSize(); i++)
        
            cout << uniquePtr[i];
            //This is all O's
        

这不起作用,因为在 func() 完成时 uniquePtr 设置为全 0。我无法弄清楚如何修改 uniquePtr 以便我的其他功能可以访问它。我没有尝试创建一个新的 unique_ptr 来传递给 func() 然后使用 move(uniquePtr) 但这甚至不会编译。

如果 uniquePtr 被一个函数修改,在这种情况下将其分配为布尔值 1 或 0,那么在类中的函数之外是否应该可以访问它?如果我在函数中打印 uniquePtr[index] 它会给我预期的结果。

感谢您的帮助!

【问题讨论】:

How can I initialize C++ object member variables in the constructor?的可能重复 uniquePtr 在 func() 完成时被销毁不,不是,你为什么会这样认为? @hellow OP 应该使用 bases-members-initialiser,但这与所提出的问题无关。 uniquePtr 是一个非静态成员,因此它的生命周期与ClassName 对象的生命周期相关。你有什么具体的问题让你得出“这行不通”的结论? func 的目的是什么,为什么它必须是非静态的?为什么它必须是const 合格的?为什么需要将指向函数的指针作为参数传递?你不能像任何其他普通成员变量一样简单地使用它吗? 【参考方案1】:

unique_ptr 不会通过将其传递给函数通过引用来销毁,所以你在这里是安全的。

但是,通过引用传递unique_ptr 可能不是表达想法的最佳方式。非拥有指针在 C++ 中由普通的 C 样式指针表示,因此这样做是安全且惯用的:

void func(bool (*ptr)[]) const  ...

然后

func(uniquePtr.get());

如 cmets 中所述,数据成员应该这样初始化:

ClassName::ClassName() : unique_ptr(new bool[someSize()]) 
    func(uniquePtr.get());

(如果可以,请使用std::make_unique 而不是new

【讨论】:

我的意思是 uniquePtr 在 func() 完成时被删除。我认为这是因为每当我尝试访问 uniquePtr[index] 时,它都设置为 0。 @jav_solo 请就您尝​​试过什么提出问题并显示。如果您尝试访问 uniquePtr[index] 但它不起作用,执行此操作的代码应该在问题中。问另一个问题并提供minimal reproducible example。 我已更新问题以反映我的误解。 @jav_solo 不,您应该提出 NEW 问题并提供minimal reproducible example。请仔细阅读这意味着什么。 既然你提供的是not verifiable,我投票结束这个问题。

以上是关于在构造函数中使用 unique_ptr的主要内容,如果未能解决你的问题,请参考以下文章

如何在构造函数中为成员 unique_ptr 赋予默认值? [复制]

shared_ptr 和 unique_ptr 构造函数

当成员是unique_ptr时删除了复制构造函数[重复]

具有右值删除器的 unique_ptr 构造函数返回 null?

`unique_ptr< T const [] >` 是不是应该接受 `T*` 构造函数参数?

使用显式定义的默认构造函数将 unique_ptr 的类内成员初始化程序设置为 nullptr 错误