【发布时间】:2016-02-25 08:34:05
【问题描述】:
在发现我需要 delete 我创建的任何 new 指针后,我很快意识到我的项目充满了内存泄漏,我什至不知道。所以我被提示使用智能指针。但是,在尝试创建智能指针的多个实例时我遇到了问题。我创建了一个 SSCE 来更好地解释这一点。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <memory>
#include "classa.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
std::unique_ptr<ClassA> classa; //<----- a smart pointer of a Class type
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "classa.h"
#include <QDebug>
QVector<ClassA*> classes;//<------ QVector that contains instances of ClassA
//So I can retrieve them later based on an index.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
classa = std::unique_ptr<ClassA>(new ClassA()); //<---- Created here
classes.push_back(classa.get()); //<---- appended to the QVector
}
MainWindow::~MainWindow()
{
delete ui;
}
//When the button is clicked, the program crashes when trying to qDebug
//because the first instance that was loaded in the QVector is no longer
//"valid." It stops being "valid" when I create the second instance of ClassA
void MainWindow::on_pushButton_clicked()
{
classa = std::unique_ptr<ClassA>(new ClassA());
classes.push_back(classa.get());
qDebug() << classes.at(0);
}
希望上面的 cmets 能解释清楚。想到的第一个解决方案是将我在 mainwindow.h 中的声明更改为 std::unique_ptr<ClassA> *classa;,但这不会破坏智能指针的目的吗?
真的很困惑。感谢您的宝贵时间。
【问题讨论】:
-
不要将指针存储在像
QVector这样的容器中。如果您不使用任何多态性,那只会让一切变得困难。直接存储ClassA。如果确实需要存储基类指针,请创建QVector<std::unique_ptr<ClassA>,或使用any of Qt's smart pointers。 -
你好。问题(我相信)不在于我如何选择存储它们。我已经尝试过你的建议。它仍然使第一个实例“无效”,并且只要我靠近它就会崩溃。我什至将第一个实例放在
ClassA* variable中,当我在创建第二个实例后调用它时,它崩溃了。 -
感谢您编写一段代码。但是... A) 你的问题与 Qt 有什么关系?没有。您可以编写一个不涉及 Qt、类继承等的示例。B) 实际问题是什么? 是的,它就在代码中,但您不能描述 呢?我们真的必须从源头找出预期行为/观察到的行为吗?
-
通过从智能指针中提取哑指针并将其存储起来供以后使用,您就破坏了智能指针的用途。
-
有很多事情,只是不是你做了什么。
unique_ptr的全部意义在于它是唯一的。我们真的不知道你真正的问题是什么。你为什么要使用指针?我们不知道。classa有什么用途?我们不知道。
标签: c++ qt class smart-pointers