在堆和堆栈中创建对象的差异

Difference in creating an object in the heap and in the stack

本文关键字:创建对象 堆栈      更新时间:2023-10-16

假设我有以下两个类:

#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以释放内存。这是正确的吗?

因此,使用一个或另一个?

有一些优势

带有指针和新关键字,您可以在堆上创建对象,然后将其分配给堆栈上的指针>。因此,当指针脱离范围并从堆栈中"弹出"时,您将无法再访问对象了。(内存泄漏(如果在堆栈上创建对象,则不必担心释放内存(在这种情况下,删除指针指向的对象(

为了正常使用,我会选择堆栈版本。设计模式有一些老式的实现,您可以在其中开始使用继承,并在那里使用PTR。