我的绘画程序中的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/

10-09 05:07