我的绘画程序中的canvas小部件具有一个自定义的圆形光标,其大小指示当前的画笔大小。 CanvasWidget包含一个QCursor成员,每当笔刷宽度更改时,该成员都会从新的QPixmap重新创建。此实现会泄漏内存吗?
class CanvasWidget : public QWidget
{
public slots:
void changeBrushWidthSlot(int);
private:
QCursor _brushCircleCursor;
};
void CanvasWidget::changeBrushWidthSlot(int newBrushWidth)
{
QPixmap circlePixmap;
circlePixmapUtilityMethod(newBrushWidth,&circlePixmap);
//will this line leak memory?
_brushCircleCursor = QCursor(circlePixmap);
setCursor(_brushCircleCursor);
}
当我说“_brushCircleCursor = QCursor(circlePixmap)”时,我不知道_brushCircleCursor以前的像素图数据是否被抛出。如果不是这样,那么changeBrushWidthSlot()最终将用垃圾填充内存。
顺便说一句,丢弃_brushCircleCursor成员并这样做会更安全或更糟?
void CanvasWidget::changeBrushWidthSlot(int newBrushWidth)
{
QPixmap circlePixmap;
circlePixmapUtilityMethod(newBrushWidth,&circlePixmap);
setCursor(QCursor(circlePixmap));
}
感谢您的帮助。
最佳答案
Qt通常使用Smart Pointer Pattern来管理其类(包括QCursor)的内部数据。当您将新的QCursor分配给_brushCircleCursor游标时,_brushCircleCursor会将其内部数据指针替换为指向新游标数据的指针,并删除旧数据(如果不再由其他对象引用)。这既可以防止内存泄漏,又可以优化对象复制操作的性能。 Qt将此过程称为Implicit Sharing。借助此功能,您提供的两个代码段同样安全,并提供大致相同的性能。
关于c++ - QCursor是否可以从QPixmaps重新创建泄漏内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22415883/