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

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 个 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];

【讨论】:

以上是关于释放动态数组初始化时程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 进行初始化的 C 动态分配数组

C++如何在用new创建动态数组的同时初始化数组

4-数组指针与字符串1.4-动态内存分配

指针与变量(或数组)的动态创建与释放

释放数组会使应用程序在 xCode 中崩溃

释放模块中声明的变量时出错