假设我有以下两个类:
#ifndef CLASS1_H
#define CLASS1_H
#include <QDebug>
class Class1
{
public:
Class1(){}
void printName()
{
qDebug() << "Class1";
}
};
#endif // CLASS1_H
和
#ifndef CLASS2_H
#define CLASS2_H
#include "class1.h"
class Class2
{
public:
Class2(Class1 *pointerToClass1)
{
this->pointerToClass1 = pointerToClass1;
}
void doSomething()
{
this->pointerToClass1->printName();
}
private:
Class1 *pointerToClass1;
};
#endif // CLASS2_H
主要功能如下:
#include <QCoreApplication>
#include "class1.h"
#include "class2.h"
void func1()
{
Class1 class1;
Class2 *class2_1 = new Class2(&class1);
Class2 class2_2(&class1);
class2_1->doSomething();
class2_2.doSomething();
delete class2_1;
class2_1 = NULL;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
func1();
return a.exec();
}
在堆中创建对象(例如Class2 *class2_1 = new Class2(&class1);
)和在堆栈上创建对象(例如Class2 class2_2(&class1);
)的主要区别是什么?
据我所知,当在本地声明并且寿命较短时,最好在堆栈上创建对象。此外,当对象退出堆栈并在堆中时,数据会丢失,我们需要调用delete来释放内存。这是对的吗?
因此,使用一个或另一个有一些优势吗?
答案 0 :(得分:2)
使用指针和new关键字在堆上创建对象,并将其分配给堆栈上的指针 。因此,当指针超出范围时,它会弹出&#34;弹出&#34;从堆栈中你不再能够访问你的对象了。 (这是内存泄漏) 如果在堆栈上创建对象,则不必担心释放内存(在这种情况下删除指针指向的对象)
对于正常使用,我会使用堆栈版本。有一些设计模式的旧式实现,你开始使用继承,你使用ptrs。