首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt::make_shared用于创建QSharedPtr,而std::make_shared用于创建std::shared_ptr

Qt::make_shared用于创建QSharedPtr,而std::make_shared用于创建std::shared_ptr
EN

Stack Overflow用户
提问于 2014-10-10 08:40:04
回答 1查看 7.5K关注 0票数 7

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

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

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

代码语言:javascript
复制
namespace Qt
{
  template<class T, class... Args>
  QSharedPointer<T> make_shared(Args&&... args)
  {
    return QSharedPointer<T>(new T(std::forward<Args>(args)...));
  }
}

或者像这样,用于创建QPointer

代码语言:javascript
复制
namespace Qt
{
  template<class T, class... Args>
  QPointer<T> make_ptr(Args&&... args)
  {
     return QPointer<T>(new T(std::forward<Args>(args)...));
  }
}

它可以用来:

代码语言:javascript
复制
auto pCancelButton = Qt::make_ptr<QPushButton>("Cancel", this);

对这种方法是否有任何警告?这种方法有什么公开的用法吗?

UPDATE --我声称只要QPointer有用,Qt::make_ptr就很有用,因为它会隐藏new操作符,并确保只为继承QObject的东西调用new。Qt用户做了很多new的工作,但是这样我们就可以确保new只在Qt上下文中使用。

EN

回答 1

Stack Overflow用户

发布于 2014-10-10 09:06:14

make_shared这样的特性严格依赖于完美的转发功能,这是只有在C++11和引入通用(转发)引用之后才能提供的功能。话虽如此,如果没有完美的转发,使用此功能可能会效率低下。Qt比最近的C++标准老得多,因此直到QT5.1才可用(就像以前一样,您必须使用Qt的内部预处理宏(如SIGNALSLOT )来建立连接)。

QT5.1已经为QSharedPointer提供了自己的智能指针实现。

静态create成员函数可以如下所示:

代码语言:javascript
复制
auto ptr = QSharedPointer<QPushButton>::create("Cancel", this);

但请注意以下描述:

注意:这个函数只有在支持任意数量参数的完美转发的编译器中才可用。如果编译器不支持必要的C++11特性,则必须使用调用默认构造函数的重载。

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

  1. 这种特殊的完美转发功能可以在单个系统中分配,为存储的对象和引用计数器调用内存。
  2. 内存分配与调用上下文分离,因此在构造另一个对象(例如函数调用时,编译器可以自由选择计算参数的顺序)时,避免出现抛出异常时的内存泄漏。考虑: foo(QSharedPointer(新的QPushButton("Cancel",this)),MayThrow();

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26295238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档