我遇到了以下问题。 我想调整结构(汽车)上的指针数组。我得到了以下代码。
Class Car{
...
char * Owner_Name;
char * carID
};
Class Register {
...
int CarCNT;
int car_num_default;
Car ** dataBase;
Register ()
{ //constructor
car_num_default = 5 ; //for example;
dataBase = new Car * [car_num_default];
}
};
现在我加6号。我需要调整我的汽车指针数量。如何在不造成任何内存泄漏的情况下这样做?还是内存错误? :) 我尝试了下面的代码,但它会造成一些内存泄漏..
void Register:: Add ( const char * carID, const char * owner)
{
if (carCNT == car_num_default) // now it's full array need resize
{
car ** tmp = new car * [carCNT]; //create new array ;
for(int i = 0 ; i < carCNT;i++)
tmp[i] = new car(databaze[i]->car_ID,databaze[i]->owner_name);
free(database); //free memory and than alloc new bigger
database = new car * [car_num_default * 5];
for(int i = 0; i < carCNT; i++)
data_by_RZ[i] = tmp [i];
free(tmp);
car_num_def = car_num_def * 5;
}
databaze[carCNT] = new car(....);
carCNT++;
}
感谢您的帮助!
答案 0 :(得分:1)
以下是内存管理中明显错误的列表:
*这是所要求的代码:
Car** tmp = new Car*[car_num_default * 5];
for(int i = 0; i < CarCNT; i++)
tmp[i] = database[i];
delete[] database;
database = tmp;
答案 1 :(得分:0)
请记住,函数在函数执行完毕后会破坏它们的参数。
由于您将carID和owner作为指针传递并将它们插入到数组中,因此在执行后会破坏这些值,并且放在数组中的指针将变为无效导致泄漏。仅当您想要对指针本身进行更改时才使用指针,但从不存储指针,因为它很快就会被破坏。
您似乎在不应该或不必要的地方使用指针。这是一个更简单的代码版本:
Class Car{
...
char Owner_Name;
char carID;
};
Class Register {
...
int CarCNT;
int car_num_default;
Car * dataBase;
Register ()
{ //constructor
car_num_default = 5 ; //for example;
dataBase = new Car [car_num_default];
}
};
void Register:: Add ( const char carID, const char owner)
{
if (CarCNT == car_num_default) // now it's full array need resize
{
car * tmp = new car [carCNT]; //create new array ;
for(int i = 0 ; i < carCNT;i++)
tmp[i] = new car(dataBase[i].car_ID,dataBase[i].owner_name);
free(dataBase); //free memory and than alloc new bigger
dataBase = new car [car_num_default * 5];
for(int i = 0; i < carCNT; i++)
data_by_RZ[i] = tmp [i];
free(tmp);
car_num_def = car_num_def * 5;
}
Car x(...);
dataBase[CarCNT] = x;
carCNT++;
}
最后,我要提出四点意见:
1)这看起来不像C ++,或者你没有使用正确的命名
2)我不确定这段代码是如何编写的,因为大多数变量名都不正确(我试图解决我遇到的问题)。
3)过度使用指针(换言之,内存位置)是导致内存泄漏的主要原因。小心处理它们,只在必要时使用它们。
4)IFFF你必须使用多指针,然后像这样添加析构函数(反构造函数)~Car或〜在任何类上注册,当元素被销毁时用作指向信号的指针。通过这种方式,您可以通过写入控制台或正常处理破坏来了解泄漏的位置。
希望有所帮助