Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在堆和堆栈中创建对象的区别_C++_Qt - Fatal编程技术网

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

C++ 在堆和堆栈中创建对象的区别,c++,qt,C++,Qt,假设我有以下两个类: #ifndef CLASS1_H #define CLASS1_H #include <QDebug> class Class1 { public: Class1(){} void printName() { qDebug() << "Class1"; } }; #endif // CLASS1_H 主要功能如下所示: #include <QCoreApplication> #i

假设我有以下两个类:

#ifndef CLASS1_H
#define CLASS1_H

#include <QDebug>

class Class1
{
public:
    Class1(){}

    void printName()
    {
        qDebug() << "Class1";
    }
};

#endif // CLASS1_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();
}
#包括
#包括“class1.h”
#包括“class2.h”
void func1()
{
1类;
Class2*Class2_1=新的Class2(&class1);
第2类第2_2类(和第1类);
class2_1->doSomething();
class2_2.doSomething();
删除类别2_1;
class2_1=空;
}
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
func1();
返回a.exec();
}
在堆中创建对象(例如
Class2*Class2_1=newclass2(&class1);
)和只在堆栈上创建对象(例如
Class2 Class2_2(&class1);
)的主要区别是什么

据我所知,当对象在本地声明并且生命周期短时,最好在堆栈上创建该对象。此外,当对象退出堆栈和堆时,数据丢失,我们需要调用delete来释放内存。对吗


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

与指针和新关键字一起使用会有一些好处,您可以在堆上创建一个对象,并将其分配给堆栈上的指针。因此,当指针超出范围并从堆栈中“弹出”时,您将无法再访问对象。(这是内存泄漏) 如果在堆栈上创建对象,则不必担心释放内存(在本例中,删除指针指向的对象)


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

使用指针和新关键字在堆上创建一个对象,并将其分配给堆栈上的指针。因此,当指针超出范围并从堆栈中“弹出”时,您将无法再访问对象。(这是内存泄漏) 如果在堆栈上创建对象,则不必担心释放内存(在本例中,删除指针指向的对象)


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

唯一的区别是,当您在堆上分配内存时,内存在运行时动态分配,而局部变量(实际上不必在“堆栈”上)在编译时由编译器分配。它们在运行时构造相同。哦,当然你必须自己管理堆分配对象的销毁。我真的不认为它是重复的,我不想知道操作系统如何控制它。我主要想知道使用其中一种是否有好处。记忆就是记忆就是记忆。对象位于何处并不重要,如果您想了解更多关于操作系统如何处理内存分配的信息,那么您可以从更高的层次提出要求。C++对象模型和低级OS内存分配函数有很大的不同。一般来说,你应该避免在C++中尽可能多地使用指针和(直接)动态分配。大多数时候,它并不是真正需要的。与直接对象(不是指针)一起使用,而不是
new[]
。如果需要链接到另一个对象,首先尝试使用引用,否则简单的指针就可以了。如果您需要多态性指针,那么通常必须使用C++11中引入的。通过这样做,尽可能避免使用指针,您的问题得到了明显的答案:不要使用在堆上分配的对象,除非您确实无法避免,然后使用智能指针。使用现代编译器、复制省略和移动语义,您不必担心按值传递或返回对象。唯一的区别是,当您在堆上分配内存时,内存是在运行时动态分配的,而局部变量(实际上不必在“堆栈”上)由编译器在编译时分配。它们在运行时构造相同。哦,当然你必须自己管理堆分配对象的销毁。我真的不认为它是重复的,我不想知道操作系统如何控制它。我主要想知道使用其中一种是否有好处。记忆就是记忆就是记忆。对象位于何处并不重要,如果您想了解更多关于操作系统如何处理内存分配的信息,那么您可以从更高的层次提出要求。C++对象模型和低级OS内存分配函数有很大的不同。一般来说,你应该避免在C++中尽可能多地使用指针和(直接)动态分配。大多数时候,它并不是真正需要的。与直接对象(不是指针)一起使用,而不是
new[]
。如果需要链接到另一个对象,首先尝试使用引用,否则简单的指针就可以了。如果您需要多态性指针,那么通常必须使用C++11中引入的。通过这样做,尽可能避免使用指针,您的问题得到了明显的答案:不要使用在堆上分配的对象,除非您确实无法避免,然后使用智能指针。使用现代编译器、复制省略和移动语义,您不必担心按值传递或返回对象。
#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();
}