正如Bjarne的“C++之旅”中所述,作为一种已知的C++14实践,应该避免代码中赤裸裸的new和delete。标准库提供了std::make_shared和std::make_unique,用于创建智能指针,以便立即将分配的对象存储在其中。
但是,不可能将这些例程用于非标准的智能指针,例如在Qt中。Qt有自己的内存管理模型(带有父级),但也提供了智能指针类,如QSharedPointer和QPointer (尽管后者实际上不是一个拥有指针)。
我的问题是:创建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);对这种方法是否有任何警告?这种方法有什么公开的用法吗?
UPDATE --我声称只要QPointer有用,Qt::make_ptr就很有用,因为它会隐藏new操作符,并确保只为继承QObject的东西调用new。Qt用户做了很多new的工作,但是这样我们就可以确保new只在Qt上下文中使用。
发布于 2014-10-10 09:06:14
像make_shared这样的特性严格依赖于完美的转发功能,这是只有在C++11和引入通用(转发)引用之后才能提供的功能。话虽如此,如果没有完美的转发,使用此功能可能会效率低下。Qt比最近的C++标准老得多,因此直到QT5.1才可用(就像以前一样,您必须使用Qt的内部预处理宏(如SIGNAL和SLOT )来建立连接)。
QT5.1已经为QSharedPointer提供了自己的智能指针实现。
静态create成员函数可以如下所示:
auto ptr = QSharedPointer<QPushButton>::create("Cancel", this);但请注意以下描述:
注意:这个函数只有在支持任意数量参数的完美转发的编译器中才可用。如果编译器不支持必要的C++11特性,则必须使用调用默认构造函数的重载。
使用make_shared和create函数而不是直接调用构造函数并使用new分配内存有两个主要优点。
也就是说,如果编译器首先执行new QPushButton("Cancel", this)表达式,然后在调用QSharedPointer的构造函数之前调用MayThrow()函数,则如果MayThrow()函数抛出异常,则可能会泄漏内存。
https://stackoverflow.com/questions/26295238
复制相似问题