gpt4 book ai didi

c++ - QPixmaps 中的 QCursor 重建是否会泄漏内存?

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:09 25 4
gpt4 key购买 nike

我的绘画程序中的 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++ - QPixmaps 中的 QCursor 重建是否会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com