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();
}