2013-03-26 1 views
1

У меня проблемы с использованием памяти в моей домашней программе, которая используется для хранения информации о компаниях и ее владельцах. Класс CompompTemplate представляет эту информацию.Как избежать утечек памяти в программе с динамическим массивом, содержащим указатели на объекты?

public: 
CompanyTemplate (const string & oName, 
       const string & oAddr, 
       const string & cName, 
       const string & cAddr); 

Другой CCompanyIndex класс используется для хранения нескольких записей, используя динамический массив указателей (я не разрешено использовать векторы). Вот CCompanyIndex конструктор:

CCompanyIndex :: CCompanyIndex (void) 
{ 
allocated = 1000; 
current_size = 0; 
pole = new CompanyTemplate* [allocated]; 
for (int i=0; i<allocated; i++) 
{ 
    pole[i] = NULL; 
} 
} 

CCompanyIndex также методы Add (добавить запись), Del (удалить запись), поиск (поиск в информации о компании владельца У меня возникли проблемы с помощью метода Add, хотя все основные. тесты хороши, у меня есть утечки памяти, как говорит Valgrind, в методе Add.

bool CCompanyIndex :: Add(const string & oName, 
         const string & oAddr, 
         const string & cName, 
         const string & cAddr) 
{ 

int pos = findPos(oName, oAddr); 
     if(pos != -1) 
     { 
      return false; 
     } 
if ((current_size)>=allocated) 
{ 
    CompanyTemplate ** temp; 
    allocated = allocated*2+1; 
    temp = new CompanyTemplate* [allocated]; 
    for (int i=0; i<current_size; i++) 
    { 
     temp[i]=pole[i]; 
    } 
pole = temp; 

for (int i=0; i<current_size; i++) 
{ 
    if ((pole[i])->Compare(oName,oAddr)<0) 
    { 
     current_size++; 
     for (int k=current_size-1; k>=i; k--) 
     { 

     pole[i] = new Comp pole[k+1]=pole[k]; 
     }anyTemplate(oName, oAddr, cName,cAddr); 
     return true; 
    } 
} 

pole[current_size] = new CompanyTemplate(oName, oAddr, cName,cAddr); 
current_size++; 
return true; 
} 

элементы массива перераспределение работы, как и ожидалось, более вероятно, у меня есть ошибка в деструкторе, но до сих пор не могут найти. Здесь это:

CCompanyIndex :: ~CCompanyIndex (void) 
{ 
for (int i=0; i<allocated; i++) 
{ 
    delete pole[i]; 
} 
delete [] pole; 
pole = NULL; 
} 

Благодаря

+0

избежать сырых указателей, где вы можете должно быть хорошее начало ... – PlasmaHH

+0

Чтобы уточнить @PlasmaHH, используя зЬй :: shared_ptr и std :: unique_ptr (и std :: vector, увы), чтобы управлять вашими ресурсами, фактически устранит утечки памяти. – metal

ответ

1

, если право собственности остается неясным, просто использовать std::shared_ptr.

Конечно, в профессиональной обстановке лучшим ответом может быть анализ лучше и лучшая идея владения, например, действительно ли он разделен?

но отсутствует, используйте std::shared_ptr.


, кстати, похоже, ваш класс не в состоянии справиться с копирование правильно. это называется «правилом трех» (или для C++ 11, «правило пяти»). по сути, если вы определяете любой из деструкторов, конструктор копирования или оператор присваивания копии, то вам, скорее всего, потребуется все три, чтобы правильно справляться с копированием.

, но самым простым является определение таких операций, но вместо этого используются стандартные библиотечные контейнеры, такие как std::vector и стандартные интеллектуальные указатели библиотеки, такие как std::shared_ptr.

например. вместо определения pole в качестве необработанного указателя (для массива), определите его как std::vector.

1

При таком общем правиле общий ответ будет: использовать vector из shared_ptr.

Но я предположил, что ваша домашняя работа заключается в реализации своего рода std::vector<CompanyTemplate> с использованием «низкого» уровня C++, без STL и интеллектуальных указателей (в противном случае это лучший способ использования C++). Итак:

Может быть, у вас есть другие ошибки, но вот два:

CompanyTemplate ** temp; 
allocated = allocated*2+1; 
temp = new CompanyTemplate* [allocated]; 
int i=0 
for (; i<current_size; i++) 
{ 
    temp[i]=pole[i]; 
} 
for (; i<allocated ; i++) // you want to make NULL the new pointers 
{ 
    temp[i]=NULL 
} 
delete [] pole; // delete old array. 
pole=temp; 

 Смежные вопросы

  • Нет связанных вопросов^_^