在堆和堆栈中创建对象的区别

时间:2017-06-07 16:16:26

标签: c++ qt

假设我有以下两个类:

#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来释放内存。这是对的吗?

因此,使用一个或另一个有一些优势吗?

1 个答案:

答案 0 :(得分:2)

使用指针和new关键字在堆上创建对象,并将其分配给堆栈上的指针 。因此,当指针超出范围时,它会弹出&#34;弹出&#34;从堆栈中你不再能够访问你的对象了。 (这是内存泄漏) 如果在堆栈上创建对象,则不必担心释放内存(在这种情况下删除指针指向的对象)

对于正常使用,我会使用堆栈版本。有一些设计模式的旧式实现,你开始使用继承,你使用ptrs。