【问题标题】: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")};

标签: c++ arrays pointers memory-management


【解决方案1】:
  • Person (*pp)[4] 是一个指向 4 个 Persons 数组的指针。
  • 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];
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多