Qt是否已经拥有自己的new和delete运算符?

时间:2014-09-19 10:20:48

标签: c++ qt new-operator delete-operator

我正在使用QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem

这意味着在显示时调用大量new + addItem(),并removeItem() + delete来删除未使用的点。

当然,对于性能问题,我已经实现了自己的newdelete运算符,这些运算符基本上可以回收预先分配的内存块。

除了 Qt 类(我的意思是 QObject 派生类)之外,这些运算符可以很好地处理任何事情。引发的错误每次都不同,但在所有插槽函数执行完毕且没有错误后,内部调用期间始终发生错误。

我也试过了一些QWidget添加到某些布局等的实例。

所以问题是, Qt 是否已经拥有自己的new和删除operators,我完全不会自己定义自己的?{/ p>

1 个答案:

答案 0 :(得分:2)

检查Qt的标题以确定是否存在此类自定义运算符是微不足道的。他们没有。

QGraphicsRectItem 来自QObject,因此无论如何都不是问题。由于Qt广泛使用PIMPL惯用语,并且QGraphicsItem正在堆上分配其PIMPL,因此您没有像您认为的那样从中获得那么多的节省。

您还需要显示运营商的实施情况 - 据我所知,您并未保持正确对齐。您要定位哪些编译器?什么版本的Qt?

要做你想做的事,你必须修改Qt。声明并实施:

void* QGraphicsItem::operator new (size_t sz)
void* QGraphicsItem::operator new[] (std::size_t count)
void QGraphicsItem::operator delete (void* ptr, std::size_t sz)
void QGraphicsItem::operator delete[] (void* ptr, std::size_t sz)
void* QGraphicsItemPrivate::operator new (size_t sz)
void QGraphicsItemPrivate::operator delete (void* ptr, std::size_t sz)

确保您的分配器正确对齐存储。