如何显示您传递了指针的所有权
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";
首先,我知道 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";