如Bjarne Stroustrup的《C++旅程》中所述,以及众所周知的C++14惯例,应避免在代码中使用裸的
然而,这些例程无法用于非标准智能指针,例如Qt中的智能指针。Qt具有自己的内存管理模型(具有父项),但还提供了智能指针类,如
我的问题是:是否方便创建
这个方法有什么注意事项吗?公开知道有哪些使用该方法的情况吗?
更新:我认为在QPointer有用的情况下,Qt::make_ptr也有用,因为它将隐藏new运算符并确保只为继承QObject的内容调用new。 Qt用户经常使用new,但通过这种方式我们可以确保new仅在Qt上下文中使用。您对这种想法有何看法?
new
和delete
。标准库提供std::make_shared
和std::make_unique
用于创建智能指针并立即将分配的对象存储其中。然而,这些例程无法用于非标准智能指针,例如Qt中的智能指针。Qt具有自己的内存管理模型(具有父项),但还提供了智能指针类,如
QSharedPointer
和QPointer
(尽管后者实际上不是拥有指针)。我的问题是:是否方便创建
std::make_shared
的Qt类似物?比如,为创建QSharedPointer
:namespace Qt
{
template<class T, class... Args>
QSharedPointer<T> make_shared(Args&&... args)
{
return QSharedPointer<T>(new T(std::forward<Args>(args)...));
}
}
或者像这样,用于创建 QPointer
:
namespace Qt
{
template<class T, class... Args>
QPointer<T> make_ptr(Args&&... args)
{
return QPointer<T>(new T(std::forward<Args>(args)...));
}
}
它可以这样使用:
auto pCancelButton = Qt::make_ptr<QPushButton>("Cancel", this);
这个方法有什么注意事项吗?公开知道有哪些使用该方法的情况吗?
更新:我认为在QPointer有用的情况下,Qt::make_ptr也有用,因为它将隐藏new运算符并确保只为继承QObject的内容调用new。 Qt用户经常使用new,但通过这种方式我们可以确保new仅在Qt上下文中使用。您对这种想法有何看法?
QPointer
呢? - Mikhailmake_with_parent
比make_ptr
更好,因为重要的是对象的生命周期由父对象管理。用于引用对象的特定类型的非拥有指针是无关紧要的。强制使用QPointer
会在只需要原始指针的情况下增加不必要的开销。 - OktalistQPointer
来说,将对象的存储和引用计数的存储合并为单个堆内存分配可能没有意义,因为引用计数预计会比对象的寿命更长。 - Oktalist