2012-03-05 3 views
1

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

Но в данном случае я не могу освободить память, не прерывая кучу по крайней мере в соответствии с майкрософт отладчика в Visual Studio 2010.

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

Заранее спасибо

#include <iostream> 
#include <algorithm> 
#include <cmath> 

using namespace std; 
int sieve(int n) 
{ 
    int *a = (int *) malloc(sizeof(int) * n); 
    int max = floor(sqrt((double)n)); 
    int p = 2; 
    memset(a,0,sizeof(int) * n); 
    while(p<=max) 
    { 
    for(int i = 2 * p; i <= n; i+= p) 
     a[i] = 1; 
    while(a[++p]) /* Empty */ ; 
    } 
    while(a[n]) n--; 
    /* free(a); */ // free our array as we are done with it. but it generate a heap error 
    return n; 
} 
int main(void) 
{ 
    cout << sieve(100) << endl; 
    system("pause"); 
    return 0; 
} 
+1

у вас есть из доступа границ, поэтому, вероятно, ваша Высвобождение ошибка – Anycorn

+0

нет времени для отладки это для вас, но Valgrind говорит, что есть память ошибка чтения/записи – kfmfe04

+0

Вы можете посмотреть на 'alloca' - HTTP://www.mkssoftware.com/docs/man3/alloca.3.asp – sje397

ответ

3

В вашей программе есть утечки памяти, поскольку вы не освобождаете выделенную память. используйте «бесплатно» здесь, как вы использовали malloc и incase, если вы планируете использовать «новый», тогда используйте оператор «delete» попробуйте освободить оперативную память перед оператором return. вы также можете использовать инструмент valgrind, чтобы узнать об утечке памяти в вашей программе. проверьте это url для получения дополнительной информации.

Этот инструмент поможет вам обнаружить утечки памяти в вашей программе.

+0

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

2

Да, ваша программа, как это стенды будет утечка памяти.

В общем, если вы выделения памяти динамически (с помощью malloc в C или new в C++), и вы не используете смарт-указатели, вы должны освободить память с помощью free или delete соответственно.

В вашей конкретной тестовой программе он выйдет сразу после вызова метода sieve(), что означает, что выделенная память автоматически будет освобождена операционной системой.

Также обратите внимание, что вы, кажется, писать C код в C++:

  • malloc является C способ выделения памяти. Если вы должны использовать необработанные указатели, вместо этого вы должны использовать new в C++.
  • Еще лучше, используйте стандартные библиотечные контейнеры, такие как vector, которые автоматически управляют памятью для вас.
3

Эта линия может быть причиной ошибки:

for(int i = 2 * p; i <= n; i+= p) 

Здесь петля в то время как i меньше или равна к n. Но, как и все массивы, индекс должен быть от 0 до (размер - 1). Вы должны выделить один дополнительный элемент для массива:

int *a = (int *) malloc(sizeof(int) * (n + 1)); 
0

Вы выделяющий n Интс, индексированные от 0 к n-1. Однако вы выполняете цикл от 4 до n включительно, что означает, что вы присвоите индекс n и поврежденную память. Вот почему free вызывает ошибку (он проверяет наличие искажений при его вызове).

Вам необходимо исправить повреждение памяти, а затем вернуть звонок free.

1

Более важные вещи:

Вы выделили n Int с int *a = (int *) malloc(sizeof(int) * n);. Если вы хотите получить доступ к этой информации, вы должны начать с 0 до n-1. В строке while(a[n]) n--; вы находитесь за пределами выделенной секции памяти. Может быть, ядро ​​!!!!

И что произойдет, если все значения a[n] равны 0? вы уменьшаете n до получения отрицательных значений. Как насчет этого? Вы получаете значения a[n] с n < 0. Возможно, другое ядро.

Помните, что это C/C++. Он выполняет все, что вы пишете, поэтому будьте осторожны !!!

Общие методы программирования:

  • Проверить все пределы массива.
  • Подтвердить malloc значения возврата.
  • Всегда free или delete ваши указатели
  • Используйте правильные типы: n возможно быть unsigned, использовать его !!