要释放动态数组初始化时程序崩溃

时间:2017-01-31 22:24:19

标签: c++ arrays pointers memory-management

我正在尝试使用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;
}

2 个答案:

答案 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];