C ++调整指针数组没有STL(向量...)

时间:2015-04-15 14:32:27

标签: c++ pointers resize realloc

我遇到了以下问题。 我想调整结构(汽车)上的指针数组。我得到了以下代码。

 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++;

}

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

以下是内存管理中明显错误的列表:

  • 您使用new []进行分配,但可以免费解除分配。请参阅Is there any danger in calling free() or delete instead of delete[]?
  • 在重新分配时,您将创建新的汽车实例并复制现有汽车对象的数据,而不是将指针复制到现有的汽车对象。这导致所有以前的汽车对象泄漏。仅当将数据库复制到tmp表时才会出现此错误。如果tmp包含指向旧汽车对象的指针,则从tmp到新数据库的副本将是正确的。
  • 您不必要地创建一个tmp数组并将数据库复制到它。您应该只创建新的,更大的数组,复制,解除分配旧的数组,然后设置数据库指针。此错误不会导致泄漏,但完全没有意义,并且会浪费内存带宽。*

*这是所要求的代码:

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或〜在任何类上注册,当元素被销毁时用作指向信号的指针。通过这种方式,您可以通过写入控制台或正常处理破坏来了解泄漏的位置。

希望有所帮助