c++ - 如何正确破坏包含指针类的结构的 QVector?

标签 c++ qt memory-leaks destructor

我有一个 QVector对于一个结构体,结构体包含许多属性,有些是 int,有些是指向类的指针。和每个 TheCore将绑定(bind)到 QTabWidget 中的选项卡.

struct TheCore {
    int score;
    ClassA *classA;
    ClassB *classB;
}

QVector<TheCore> m_coresVector;
在我的源文件中,我有一个创建新 TheCore 并添加到 coresVector 的函数。此外,其中一个类将在创建时分配给 QTabWidget。
// create tab function
TheCore core;
core.score = 50;
core.classA = new ClassA();
core.classB = new ClassB();
ui->tabWidget->addTab(core.classA, "tab_1");
m_coresVector.append(core);
然后tab关闭会触发destruct函数
currentTabIndex = ui->tabWidget->currentIndex();
ui->tabWidget->removeTab(currentTabIndex)
delete m_coresVector[currentTabIndex].classA;
delete m_coresVector[currentTabIndex].classB;

m_coresVector.remove(currentTabIndex);
但是我遇到了内存泄漏。我开始了很多选项卡,然后关闭它们,内存使用量不断增加而没有下降。如何正确删除这些指针类?

最佳答案

你有选择。

  • 您可以尝试使用std::shared_ptrstd::unique_ptr供您指点
  • 将析构函数、复制构造函数和复制赋值运算符添加到您的结构中(参见 rule of 3/5/0,感谢 G.M.)

  • 另外,我建议您对其进行更多封装,将这些指针隐藏在私有(private)部分中,以防止从意外方面更改它们并提供一些接口(interface),但这可能取决于。
    你也可以尝试重构你的代码,所以你的 ClassAClassB将接受构造函数QObject* parent就像 Qt 类(class)经常做的那样。因此,当父级销毁时,它们将被销毁。

    实际上,您的“remove-tab”处理代码看起来不错,似乎没有任何内存泄漏或您的代码示例不完整。您可以在 classA 的构造函数和析构函数中添加计数器, classB以确保创建和删除它的次数。可能,泄漏在另一个地方。

    关于c++ - 如何正确破坏包含指针类的结构的 QVector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63326712/

    相关文章:

    c++ - C++ 优化中的代码重新排序在什么时候停止?

    c++ - 如何在 OpenGL 中绘制立方体?

    qt - 如何正确使用 QGraphicsLinearLayout 和 QGraphicsScene 来定位 QGraphicsItems?

    python - 在 valgrind 下运行 python 显示很多内存错误是否正常?

    c++ - boost_assert 一个参数类实现了某个方法

    c++ - C++ 上的整数溢出以及如何添加大数

    c++ - QMutexLocker 是否返回错误代码(如果有)?

    c++ - 缓慢的纹理加载

    haskell - 为什么这会导致 Haskell Conduit 库中的内存泄漏?

    c++ - 我关于这个赋值运算符错误的假设是否正确?