如何显示您传递了指针的所有权

How to show that you pass ownership of the pointer

首先,我知道 unique_ptr 和 share_ptr,但是 我没有使用 C++11 因此我不能使用它们.

google returns 的每一项可能的研究都是使用这两个智能指针的解决方案。我想要一个没有的。

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

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

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

不能使用引用。

我可以使用 Qt 中的智能指针来显示我像这样传递所有权:

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

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

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

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

注释原始指针的 C++ Core Guidelines has some advice about this and suggest you use owner from the Guideline Support Library (GSL)。

template <class T>
using owner = T;

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

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

template<typename T>
struct owner
{
    typedef T pointer;
};

MyClass(owner<PointerToPass*>::pointer p)
{
    // ...
}

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

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

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";