Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 要释放动态数组初始化时程序崩溃_C++_Arrays_Pointers_Memory Management - Fatal编程技术网

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

C++ 要释放动态数组初始化时程序崩溃,c++,arrays,pointers,memory-management,C++,Arrays,Pointers,Memory Management,我试图使用Person数组指针直接初始化数组 我成功地为初始化列表中的每个元素使用了new操作符。但是,我很困惑,因为我正在考虑释放指针使用的内存,因为我使用了new关键字 每当我使用delete[]pp时,程序就会崩溃,但其工作方式与下面粘贴的一样 有人能告诉我这件事吗 #include<iostream> #include<sstream> using namespace std; class Person { string lastName; str

我试图使用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;
}
#包括
#包括
使用名称空间std;
班主任
{
字符串lastName;
字符串名;
公众:
Person(string fname,string lname):firstName(fname),lastName(lname)
{
}
字符串输出()
{
stringstream ostr;
ostr
  • Person(*pp)[4]
    是指向4个
    Person
    s数组的指针
  • Person*pp[4]
    是指向
    Person
    的4个指针数组
由于
pp
是指针的本地数组,因此不能
删除[]
它:它在堆栈上


相反,您需要
删除
Person的每个实例

如果
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++)
删除pp[i];
  • 如果数组中的指针是指向数组的指针,则可以通过以下方式释放内存:

    for(int i(0); i < 4; i++)
        delete[] pp[i];
    
    for(int i(0);i<4;i++)
    删除[]页[i];
    

您需要对数组中的内容调用delete,而不是数组本身。您真正需要的是停止使用
new
。好的。我尝试了这行代码,它在释放它时起作用。'for(int I=0;iHow?如果初始化中没有新代码,代码将无法编译@juanchopanza@Kinyo356
Person pp[4]={个人(“优素福”、“蒂贾尼”)、个人(“穆巴拉克”、“谢蒂玛”)、个人(“发霉”、“哈鲁纳”)、个人(“法蒂玛”、“苏莱曼”)};
实际上OP不需要动态分配任何东西。