繁体   English   中英

Qt :: make_shared用于创建QSharedPtr作为std :: make_shared用于创建std :: shared_ptr

[英]Qt::make_shared for creating QSharedPtr as std::make_shared for creating std::shared_ptr

正如Bjarne Stroustrup的“C ++之旅”中所述,并且作为已知的C ++ 14实践,应该避免在代码中使用裸newdelete 标准库提供了std::make_sharedstd::make_unique用于创建智能指针以立即存储已分配的对象。

但是,不可能将这些例程用于非标准智能指针,例如Qt。 Qt有自己的内存管理模型(带父QSharedPointer ),但也提供了QSharedPointerQPointer等智能指针类(尽管后者实际上并不是拥有指针)。

我的问题是:创建std::make_shared Qt类似物不方便吗? 像这样,创建QSharedPtr

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 QPointer有用,因为它会隐藏new运算符并确保只为继承QObject东西调用new Qt用户做了很多new的,但是通过这种方式我们可以确定new只在Qt上下文中使用。 关于这个想法的任何争论?

诸如make_shared严格依赖于完美的转发功能,该功能仅在C ++ 11和引入通用(转发)引用时可用。 话虽如此,如果没有完美的转发 ,使用此功能可能效率低下。 Qt比最近的C ++标准要老,因此直到Qt 5.1才能使用它(就像之前你必须使用Qt的内部预处理宏,如SIGNALSLOT进行连接)。

Qt 5.1已经提供了自己的实现,用于为QSharedPointer制作智能指针。

静态create成员函数可以使用如下:

auto ptr = QSharedPointer<QPushButton>::create("Cancel", this);

但请注意说明:

注意:此函数仅适用于支持完全转发任意数量参数的C ++ 11编译器。 如果编译器不支持必要的C ++ 11功能,则必须使用调用默认构造函数的重载。

使用make_sharedcreate函数有两个主要优点,而不是直接使用new分配内存来调用构造函数:

  1. 这种特殊的完美转发功能可以在单个系统中分配存储对象引用计数器的内存。

  2. 内存分配与调用上下文分离,因此如果在例如函数调用中构造另一个对象时抛出异常,则可以避免内存泄漏(编译器可以自由选择评估参数的顺序)。 考虑:

     foo(QSharedPointer<QPushButton>(new QPushButton("Cancel", this)), MayThrow()); 

也就是说,如果编译器将首先执行new QPushButton("Cancel", this)的表达,然后调用MayThrow()调用的构造函数之前功能QSharedPointer ,你可以,如果泄漏内存MayThrow()函数抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM