关于C++ sample类构造函数中list<int>动态数组分配的疑问
理解
new list<int>[x1]的内存分配逻辑 嘿,我来帮你把这条语句的逻辑拆解得明明白白~首先先提个小细节:你贴的代码里有个语法错误——构造函数是不能有返回值的,所以定义里的void sample::sample(int n)应该改成sample::sample(int n),同时类里的构造函数声明也要对应改成sample(int n);,不然编译器会报错哦。
接下来回到核心问题:x2 = new list<int>[x1];到底做了什么?
这条语句是在堆内存上动态分配一个包含x1个std::list<int>对象的数组,具体拆解成两步:
- 第一步:根据
x1的值(也就是你传入构造函数的n),在堆上申请足够的内存空间,用来存放x1个独立的std::list<int>对象。每个list都会被默认初始化,也就是变成一个空的链表。 - 第二步:把这个数组的首地址赋值给指针
x2,这样x2就指向了数组的第一个list<int>元素。
举个直观的例子:如果x1的值是3,那么这条语句执行后,x2会指向一个包含3个空list的数组,你可以像操作普通数组一样访问它们:
x2[0]→ 第一个空listx2[1]→ 第二个空listx2[2]→ 第三个空list
最后要注意两个关键事项:
- 因为用了
new[]来分配数组,所以后续销毁这个数组的时候,必须用delete[] x2;,不能只用delete x2;——后者只会销毁数组的第一个元素,剩下的元素会导致内存泄漏,而且它们的析构函数也不会被正确调用。 - 这个
x2指针是类的私有成员,记得在类的析构函数里加上delete[] x2;,不然对象销毁时会漏掉堆内存的释放。
内容的提问来源于stack exchange,提问作者Mohammed Arshaan
相关产品推荐
相关产品推荐

