我正在尝试使用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;
}
答案 0 :(得分:2)
Person (*pp)[4]
是一个指向4 Person
s。Person *pp[4]
是一个包含Person
的4个指针的数组。由于pp
是一个本地指针数组,你不能delete[]
它:它在堆栈上。
相反,您需要delete
每个Person
的实例。
答案 1 :(得分:1)
如果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];