2012-03-14 4 views
0

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

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

#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; 
} 
+0

Пожалуйста, открепите свой код. –

+0

И такой код, почему все, кажется, ненавидят C++ и считают, что он полна утечек. – Xeo

+0

Это домашнее задание? –

ответ

3

Вы выделения памяти для р и д:

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

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

delete[] p; 
delete q; 

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

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

+0

'p' и' q' указывают на тот же объект, когда используется этот 'delete'. –

+0

Код неверен, потому что OP уже потерял указатель на динамически выделенный массив, 'p' не указывает на то, что' new [] 'выделено, но указывает на то, что' new'allocated. –

+0

Да, он смешивает свои указатели, я этого не видел. Сделано некоторое издание ответа. Благодарю. – mfontanini

2

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

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

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

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

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

+0

спасибо вам большое – toky

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