У меня проблемы с использованием памяти в моей домашней программе, которая используется для хранения информации о компаниях и ее владельцах. Класс 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;
}
Благодаря
избежать сырых указателей, где вы можете должно быть хорошее начало ... – PlasmaHH
Чтобы уточнить @PlasmaHH, используя зЬй :: shared_ptr и std :: unique_ptr (и std :: vector, увы), чтобы управлять вашими ресурсами, фактически устранит утечки памяти. – metal