gpt4 book ai didi

c++ - 结构中指针数组的析构函数

转载 作者:行者123 更新时间:2023-11-27 23:16:32 25 4
gpt4 key购买 nike

我有这个结构和动态分配的数组。我不能使用 std::vector 和 std::string,因为这是作业。

 struct Moves
{
const char* date;
const char* street;
const char* city;
};

struct Data
{
const char* id;
const char* name;
const char* surname;
int count;
Moves** moves;

};

我有一个类,我在其中创建一个结构数据指针数组,我在其中动态分配 char* 日期、街道、城市。

现在,我需要删除这些内存块。好吧,我试过这个:(我类的析构函数)问题是:我应该如何正确释放所有分配的内存?

class Reg
{
private:
Data** arr;
int counter;
public:
Reg(){ arr=new Data*[1000]; }
~Reg();
... other methods
};

Reg::~Reg()
{
for(int i=0;i<counter;i++)
{
for(int c=0;c<arr[i]->count;c++)
{
delete arr[i]->moves;
}

delete arr[i];
}

delete [] arr;
}

这是一个分配的例子:

arr[counter]=new Data; 
arr[counter]->id=new char[12];
arr[counter]->id=id;
arr[counter]->name=new char[strlen(name)+1];
arr[counter]->name=name;
arr[counter]->surname=new char[strlen(surname)+1];
arr[counter]->surname=surname;

arr[counter]->moves=new Moves*[100];
arr[counter]->moves[0]=new TMoves;

arr[counter]->moves[0]->city=new char[strlen(city)+1];
arr[counter]->moves[0]->city=city;

arr[counter]->moves[0]->date=new char[strlen(date)+1];
arr[counter]->moves[0]->date=date;

arr[counter]->moves[0]->street=new char[strlen(street)+1];
arr[counter]->moves[0]->street=street;

最佳答案

我不会尝试解决此代码中的每个问题,而是告诉您一个原则,出于某种原因,该原则从未在编程类(class)中教授过:从小而简单开始,一次增加一点复杂性,测试每一步,永远不要添加到不起作用的代码。

看看这个:

arr[counter]->moves[0]->city=new char[strlen(city)+1];
arr[counter]->moves[0]->city=city;

即使假设此 Moves 已正确构造,您使用 new 分配内存,然后立即放弃它,导致内存泄漏。 然后 如果 city(一个与成员同名的变量,不是一个好主意)是一个指向堆上的char[]的指针,而如果 city 在其剩余的生命周期中没有做任何坏事,如果没有其他指向该数组的指针存在(或者至少没有做任何坏事)一个指针)那么这不会导致未定义的行为。你觉得幸运吗?

相反,考虑一下:

struct Moves
{
private:
const char* city;

public:

Moves()
{
city = NULL;
}

~Moves()
{
if(city)
delete [] city;
}

void setCity(const char ncity[])
{
if(city)
delete [] city;
char *temp = new char[strlen(ncity)+1];
strcpy(temp, ncity);
city = temp;
}
};

...
arr[counter]->moves[0]->setCity(someCity);

请注意,一旦 setCity() 正常工作,从外部调用它是干净、安全和简单的。一旦 Moves 设置正确,Data 可以用类似的方式重写,然后是 Reg

一旦您习惯了这种方法,您就可以学习使用 std::string,再也不会乱用 char[]

关于c++ - 结构中指针数组的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com