【问题标题】:How to show that you pass ownership of the pointer如何表明您传递了指针的所有权
【发布时间】:2016-02-26 03:40:57
【问题描述】:

首先,我知道 unique_ptr 和 share_ptr,但是我没有使用 C++11,因此我无法使用它们。

谷歌的每一项可能的研究都会使用这两个智能指针返回一个解决方案。我想要一个没有的。

我需要通过构造函数将指针的所有权传递给另一个类。

PointerToPass* myPointer = new PointerToPass();
MyClass* myClass = new MyClass(myPointer);

所以我可以使用原始指针,但我到处阅读我应该避免它的地方。

使用引用不是一种选择。

我可以使用来自 Qt 的智能指针来显示我传递了所有权,如下所示:

QScopedPointer<PointerToPass> myPointer(new PointerToPass());
MyClass* myClass = new MyClass(myPointer.take());

此选项清楚地表明指针已传递,并且所有权已授予 myClass,即使它仍在使用原始指针。

有没有更好的方式来传达这个想法?

如果能在 MyClass 构造函数签名中看到就更好了。

【问题讨论】:

  • 您不应使用来自take 副本的new。 take 将作用域 ptr 重置为 null。
  • 是的,但在这个范围内我不再使用 myPointer。它只有在通过后才在 MyClass 中使用。
  • 为什么不new MyClass(new PointerToPass());?或者就此而言,如果指针类型不带参数,则让MyClass ctor 分配它。
  • 是的,我可以。只是在实际代码中,我必须将 3 个参数传递给 PointerToPass,所以它变得一团糟。
  • @JamesRoot 我可能错了,但可变参数构造函数只能使用 C++11。我明确表示我没有使用它。

标签: c++ qt c++03


【解决方案1】:

明确指示指针不能在外面使用怎么办?

class myClass {
    public: myClass(PointerToPass*& p): _p(p) {
        p = nullptr;
    }

    public: ~myClass() {
        delete _p;
    }

    private: PointerToPass* _p;
};

PointerToPass* myPointer = new PointerToPass();

MyClass* myClass = new MyClass(myPointer);
std::cout << myPointer << "\n";

【讨论】:

    【解决方案2】:

    C++ Core Guidelines 对此有一些建议,建议您使用Guideline Support Library (GSL) 中的owner 来注释原始指针。

    template <class T>
    using owner = T;
    

    这只是owner&lt;T&gt; 到T 的类型定义。它仅用作注释,适用于您的构造函数参数。如果此语法不是 C++11。

    不过,我们可以使用类似的想法。

    template<typename T>
    struct owner
    {
        typedef T pointer;
    };
    
    MyClass(owner<PointerToPass*>::pointer p)
    {
        // ...
    }
    

    与指南中的技术类似,这实际上并不强制执行任何操作。它确实对代码进行了注释以使所有权语义更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2013-03-21
      • 2020-07-28
      • 2013-02-19
      • 2015-09-25
      • 1970-01-01
      • 2011-03-20
      相关资源
      最近更新 更多