Вопрос

Я рассматривал здесь пример:https://blog.parasoft.com/finding-memory-leaks-in-c

#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *string, *string_so_far;
    int i, length;     length = 0;
    for(i=0; i<argc; i++) {
        length += strlen(argv[i])+1;
        string = malloc(length+1);

        /*  * Copy the string built so far. */
        if(string_so_far != (char *)0)
            strcpy(string, string_so_far);
        else *string = '\0';
        strcat(string, argv[i]);
        if(i < argc-1) strcat(string, " ");
        string_so_far = string;
    }
    printf("You entered: %s\n", string_so_far);
    return (0);
}

и прочитайте это, когда мы выполним программу со следующими аргументами:

hello this is a test

Переменная string_so_far указывает на строку “hello”, которая была присвоена в результате предыдущей итерации цикла.Но я не понимаю, как?Пошаговое объяснение было бы действительно полезно.

Во-вторых, я наткнулся на этот пример в материалах курса:

int countPrimes(int n)
{
   PrimeSet *p = new PrimeSet(n);
      return( p->countPrimeNumbers() );
}

Было заявлено, что здесь происходит утечка памяти, но я действительно не понимаю, как, вероятно, потому, что я не уверен, что именно здесь происходит.

Это было полезно?

Решение

В первом примере вы используете malloc внутри цикла для переменной.То malloc вызов резервирует блок памяти и возвращает первый адрес блока.Вам нужно удалить, чтобы заблокировать с помощью free если вам это больше не нужно.Если программист желает расширить блок памяти, лучшей альтернативой было бы realloc.Читайте больше о realloc около http://www.cplusplus.com/reference/cstdlib/realloc/.

В вашем втором примере объект, в котором находится указатель p указывает на инициализируется в куче и будет оставаться в куче до тех пор, пока программист не использует delete.Более безопасной альтернативой для создания объектов в куче является создание их в стеке, что приведет к удалению всех данных после завершения вызова метода.

int countPrimes(int n){
   PrimeSet p(n);
   return( p.countPrimeNumbers() );
}

Если управление памятью выполнено неправильно, как во втором примере, объект не может быть удален после потери единственной ссылки на него, следовательно, происходит утечка памяти.

Другие советы

Во втором примере вы распределите пространство для объекта PRIMESETET и инициализируете его, вы вызываете функцию CountPrimenumbers.Объект Primesetet по-прежнему существует, он по-прежнему занимает память, он, вероятно, выделил больше памяти, и все эта память все еще занята, но не доступна.Это утечка памяти: память, которая занята, но непригодна.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top