c++中这两种新建对象的方式有区别吗?

来源:百度知道 编辑:UC知道 时间:2024/06/04 02:35:15
// A a(4,5);
// cout<<"&a="<<&a<<endl;
A * p_a1=new A(4,5);
cout<<"&p_a1="<<&p_a1<<endl;
delete p_a1;
谢谢CJIAJIAILOVEYO,很有理,如果没有其他好的回答就把分给你了。

lyly0904,你这句话“A a(4,5); 这个是在栈上创建一个类对象 程序退出其作用域后自动调用类的析构函数”,我理解其实和int i=0是一个意思,就是一个自动变量,出了作用域就被销毁,是吧?

lyly0904的解释好像比较正确,A * p_a1=new A(4,5);也是创建对象。
我从网上的PPT教材上看到一行代码如下:
A *Ptr=new A[2]; //创建对象数组
自己加了一句测试代码如下:
cout<<"Ptr[0].X="<<Ptr[0].GetX()<<endl;//通过Ptr[0]访问第一个元素的变量X的方式就是对象调用GetX()的方式

lin1270:你说的"第二个是创建动态对象。A * p_a1 = new A(4,5);编译器在编译的时候,并不知道要分配多少内存",编译器为什么不知道,不就是sizeof(A)吗?只是规则要求运行时才确定分配的内存大小吧?

A a(4,5); 这个是在栈上创建一个类对象 程序退出其作用域后自动调用类的析构函数
A * p_a1=new A(4,5); 这个是在堆上创建一个类对象 必须手动delete释放对象 否则会造成内存泄露的 关于堆和栈的概念 请查阅相关的资料

我理解其实和int i=0是一个意思,就是一个自动变量,出了作用域就被销毁,是吧?
是的

有的

第一个是输入类A的对象a的地址,
第二个貌似不是新建对象,
用new运算符开辟一个存放类A数据类型的空间,并指定该类的初始值为 4,5,
将返回的该空间的地址赋给指针变量P,
输出该空间的地址。

我也来说一下。
第一个是创建静态对象。A a(4,5);编译器在编译的时候,知道分配sizeof(A)的内存给a,这个内存是在堆栈上分配的。
输出&a,输出的是存放a的内存地址。

在堆中分配的内存,会在退出程序块时自动回收。

第二个是创建动态对象。A * p_a1 = new A(4,5);编译器在编译的时候,并不知道要分配多少内存,只有在运行时才分分配sizeof(A)的内存,这个内存是在堆(自由存储区)中分配的。

A * p_a1 = new A(4,5);理解一下这句话。通过new运算符去申请一块内存,并用A(4,5)初始化,然后返回这块内存的地址,并反它保存在p_a1中。
输出&p_a1并不是输出存放A(4,5)内存的地址,而是输出p_a1的地址,如果要输出存入A(4,5)内存的地址,则应该输出p_a1

在堆中分配的内存,要调用delete回收,系统不会自动回收,如果没有调用delete就会造成内存泄漏