Указатели и утечки памяти - PullRequest
0 голосов
/ 14 марта 2012

Что-то не так со следующей программой?Нужно ли удалять указатели, чтобы у меня не было утечек памяти?

Пожалуйста, помогите.

#include<iostream>
using namespace std;
int main()
{
int x=2, y=3;
int *p,*q;
int **pp;

cout<<x<<","<<y<<endl;//x=2,y=3
p=&x;
q=&y;
cout<<*p<<","<<*q<<endl;//*p=2,*q=3
p=new int [5];
p[2]=9;
q=p+x;
p[0]=8;

cout<<*p<<","<<*q<<endl;//*p=8,*q=9

pp=&p;

cout<<pp[0][2]<<endl;//pp[0][2]=9

q=new int;
p=q;
*p=5;
*q=7;

cout<<*p<<","<<*q<<endl;//*p=7,*q=7
delete p;
p=NULL;
}

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Вы выделяете память для p и q:

p=new int [5];
/* ... */
q=new int;

Но вы освобождаете p только с использованием недопустимого оператора, поскольку массивы следует удалять с помощью delete [].В какой-то момент вы должны освободить как p, так и q, используя:

delete[] p;
delete q;

Обратите внимание, что, поскольку ваши указатели указывают на выделенный буфер другого указателя, вам, возможно, придется проверить, какой оператор delete соответствует какомуnew операция.

Вы должны использовать delete[] для буфера, выделенного с помощью new[] и delete с буфером, выделенного с помощью new.

2 голосов
/ 14 марта 2012

У вас есть утечка памяти.
Самое простое правило для этого:

Подсчитайте количество new & new [] в вашей программе, и вы должны иметь точно такое же количество delete и delete [] соответственно.

Ваша программа имеет new [] и new, но только один delete, так что вы теряете память, выделенную через new [].

Временное решение:
Вы должны звонить delete [] по точно такому же адресу, возвращенному new []

Наиболее подходящее решение:
Вы никогда не должны вручную управлять динамической памятью. Вы должны использовать RAII и Умные указатели , чтобы сделать это для вас, это идеальный и самый подходящий способ C ++ для сделай это.

...