gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:28:21 29 4
gpt4 key购买 nike

我有一个 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/

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