Qt,动态分配内存

Posted

技术标签:

【中文标题】Qt,动态分配内存【英文标题】:Qt, Dynamic allocation of memory 【发布时间】:2013-07-17 12:59:28 【问题描述】:

我有一个小问题:我做了一个小程序,每次用户点击 QPushButon 时,都会用他的指针创建一个新对象,这是我的代码:

ajoute *az = new ajoute;
QVBoxLayout *layoutPrincipal = new QVBoxLayout;

问题是每个已创建的对象都具有相同的名称,所以如果我想删除一个对象,可能会出错?

P.S : 抱歉我的英语不好,我是法国人

【问题讨论】:

这里缺少一些上下文。什么是ajoute,您如何处理您创建的实例? 我是否正确地说您只创建实例而不将它们放入容器中? 试图起草一个答案,但绝对缺乏上下文。对于非法语人士,“ajoute”的意思是“添加” 【参考方案1】:

问题是每个已创建的对象都具有相同的名称,所以如果我想删除一个对象,可能会出错?

似乎您正在创建一组动态分配的对象,但您不知道如何存储它们的指针。最简单的方法是使用QVector<ajoute*> 并存储动态分配的对象:

QVector<ajoute*> v;

现在,每当您创建 ajoute 时,您只需这样做:

v.push_back( new ajoute );

这将在向量(容器)的末尾添加指针。然后您可以按顺序访问它们:

v[0]; // first
v[1]; // second
v[2]; // third

显然你可以将它们删除为:

delete v[0]; // example

记住也要删除向量内的指针:

v.remove(0);

【讨论】:

谢谢,这是个好主意,我想这就是我需要的答案。因此,如果我需要创建一个“ajoute”对象属性表,我必须创建一个方法来复制“ajoute”属性的值,例如主窗口中的 QString 变量,并在 oder show 中创建另一个表并修改“ ajoute" 对象属性? @DanSnow,“ajoute 对象属性”是什么意思? 非常感谢,但我想我会放弃创建对象的想法,我会使用一个简单的容器。如果有人感兴趣,我可以将我的软件的 beta 版本传给他进行测试(它是一个密码管理器)。【参考方案2】:

您的对象很可能在堆栈上,因此下一个实例不会“记住”前一个实例。需要更多代码来微调解释。

常见的解决方案包括:

在你的类中使用一个(或多个)属性并在创建之前删除 使用 QSharedPointer 并重置指向的数据(从而实际上释放了先前的实例) (Qt 方式)使对象成为“父 QObject”的子对象:当对象树的根被处理掉时,它将被级联删除。

【讨论】:

其实我还没有做这个程序,我只是在想怎么做。 事实上我还没有制作这个程序,我只是在想怎么做。该程序的工作方式如下: 1-用户在 QLineEdit 中编写文本 2-文本存储在变量中 3-“ajoute”对象被创建 4-变量的值被发送到对象“ajoute”5 -“ajoute”对象在 QVBoxLayout 中显示 QLabel 6-出现另一个 QLineEdit,用户可以创建另一个“ajoute”对象。就像聊天 看起来您希望将字符串存储在QStringList 中,然后使用QStringListModel 作为适配器将此列表显示在QListView 中。我建议阅读doc.qt.digia.com/4.7/model-view-programming.html#view-classes 谢谢 :) 我想我会放弃创建对象的想法,我会使用一个简单的容器。如果有人感兴趣,我可以将我的软件的 beta 版本传给他进行测试(它是一个密码管理器)。

以上是关于Qt,动态分配内存的主要内容,如果未能解决你的问题,请参考以下文章

QT数据结构内存分配策略

用于创建 HDF5 数据集的 4 维 c++ 数组的动态内存分配

c语言中啥是动态分配内存?

C语言中的动态内存分配的用法举例

零基础学C语言知识总结十一:动态内存分配!

动态内存分配与静态内存分配