小白求教关于对象数组的构造和析构

coolandpi 2020-03-22 03:34:35
声明对象数组的时候三次调用了默认的构造函数,分配了内存。

ptr[0]=B()这一句运行结果是Constructor1 Destructor,这个时候分配和释放的内存与ptr=new B[3]这一句分配的第一块内存有什么关系吗?

...全文
184 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2020-03-27
  • 打赏
  • 举报
回复
引用 4 楼 weixin_40101369 的回复:
[quote=引用 1 楼 sdghchj的回复:]

ptr = new B[3]; //在堆内存里创建了连接地址的3个B对象,调用了3次默认构造函数,首地址赋给ptr
ptr[0] = B();  //调用B的默认构造函数在栈内存创建一个匿名对象,调用了1次默认构造函数,再调用B的默认operator= 运算拷贝赋值给堆内存上的ptr[0],此行结束时,析构匿名对象调用1次析构函数。
// 后面两句分别调用了对应的有参构造函数创建匿名对象,拷贝赋值,类似。最后delete时3次析构,释放堆内存。


谢谢解答,还求教一下,34行结束时为什么需要释放这个匿名对象占用的内存呢?[/quote]匿名对象用完就自动回收
coolandpi 2020-03-27
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj的回复:

ptr = new B[3]; //在堆内存里创建了连接地址的3个B对象,调用了3次默认构造函数,首地址赋给ptr
ptr[0] = B();  //调用B的默认构造函数在栈内存创建一个匿名对象,调用了1次默认构造函数,再调用B的默认operator= 运算拷贝赋值给堆内存上的ptr[0],此行结束时,析构匿名对象调用1次析构函数。
// 后面两句分别调用了对应的有参构造函数创建匿名对象,拷贝赋值,类似。最后delete时3次析构,释放堆内存。


谢谢解答,还求教一下,34行结束时为什么需要释放这个匿名对象占用的内存呢?
真相重于对错 2020-03-22
  • 打赏
  • 举报
回复
一样的
class A {
public:
	A(int n,int m){
	
	}

};
A *p = new A[3]{ { 1,2 },{ 1,2 },{ 1,3 } };
ztenv 版主 2020-03-22
  • 打赏
  • 举报
回复
ptr=new B[3];申请了一块可以存储3个B类对象的内存块;new与malloc的最大的区别:new在申请内存时会调用类的默认构造函数(无参构造函数),malloc则不会; 你可以尝试屏蔽B类的无参构造函数B(),然后再编译看能不能编译通过。 另:最好不要创建类的对象数组,而使用std::shared_ptr来代替;
sdghchj 2020-03-22
  • 打赏
  • 举报
回复

ptr = new B[3]; //在堆内存里创建了连接地址的3个B对象,调用了3次默认构造函数,首地址赋给ptr
ptr[0] = B();  //调用B的默认构造函数在栈内存创建一个匿名对象,调用了1次默认构造函数,再调用B的默认operator= 运算拷贝赋值给堆内存上的ptr[0],此行结束时,析构匿名对象调用1次析构函数。
// 后面两句分别调用了对应的有参构造函数创建匿名对象,拷贝赋值,类似。最后delete时3次析构,释放堆内存。


65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧