释放动态数组初始化时程序崩溃
Posted
技术标签:
【中文标题】释放动态数组初始化时程序崩溃【英文标题】:Program crash when dynamic array initialization is to be freed 【发布时间】:2017-01-31 22:24:18 【问题描述】:我正在尝试使用 Person 数组指针来直接初始化数组。
我成功地为初始化列表中的每个元素使用了new
运算符。但是,我很困惑,因为我正在考虑释放指针使用的内存,因为我使用了 new
关键字。
每当我使用delete [] pp
时,程序都会崩溃,但它的工作方式与下面粘贴的一样。
有人能告诉我吗?
#include<iostream>
#include<sstream>
using namespace std;
class Person
string lastName;
string firstName;
public:
Person(string fname, string lname) : firstName(fname),lastName(lname)
string output()
stringstream ostr;
ostr<<firstName<<" "<<lastName;
return ostr.str();
;
int main()
Person *pp[4] = new Person("Yusuf","Tijjani"),new Person("Mubarak","Shettima"),new Person("Musty","Haruna"),new Person("Fatima","Suleiman");
for(int i =0;i<4;++i)
cout<<pp[i]->output()<<endl;
cin.get();
return 0;
【问题讨论】:
你需要对数组中的东西调用delete,而不是数组本身。 你真正需要的是停止使用new
。
好的。我尝试了这行代码,它可以工作,释放它。 'for(int i=0;i
怎么样?如果没有初始化中的 new,代码将无法编译。 @juanchopanza
@Kinyo356 Person pp[4] = Person("Yusuf","Tijjani"), Person("Mubarak","Shettima"), Person("Musty","Haruna"), Person("Fatima","Suleiman");
【参考方案1】:
Person (*pp)[4]
是一个指向 4 个 Person
s 数组的指针。
Person *pp[4]
是一个由 4 个指向 Person
的指针组成的数组。
由于pp
是一个本地指针数组,你不能delete[]
它:它在堆栈上。
相反,您需要delete
Person
的每个实例。
【讨论】:
其实OP不需要动态分配任何东西。【参考方案2】:如果pp
是一个指向动态数组的指针,那么您可以像以前那样释放内存:
delete[] pp;
但实际上你声明了一个指针数组,而不是指向动态数组的指针:
Person *pp[4] = ...; // this is an array of pointers not a pointer to a dynamic array
在这种情况下,要释放内存,您必须遍历所有元素并对其调用 delete:
for(int i(0); i < 4; i++)
delete pp[i];
如果数组中的指针是指向数组的指针,那么你可以这样释放内存:
for(int i(0); i < 4; i++)
delete[] pp[i];
【讨论】:
以上是关于释放动态数组初始化时程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章