освободить двойной указатель

Я создал 2-D матрицу, используя двойной указатель, например:

int** pt; pt = (int*) malloc(sizeof(int)*10);

Я знаю, что указатель освобождается так

free(ptr);

Как мы можем освободить двойной указатель?

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

 octopusgrabbus13 июн. 2012 г., 15:06
То же самое касается размещения соответствующего кода malloc.
 Bo.13 июн. 2012 г., 15:01
Нужно показать нам код.
 Eitan T13 июн. 2012 г., 15:00
Это зависит от того, как вы позвонилиmalloc, Где код?
 Eitan T13 июн. 2012 г., 15:05
@bledi Итак, вам нужно перебрать эти указатели и сначала освободить указанные данные. Затем освободите сами указатели. Посмотрите на ответ Аттилы.

Ответы на вопрос(2)

Решение Вопроса

mat

int** mat = malloc(10 * sizeof(int*));
for (int i=0; i<10; ++i) {
  mat[i] = malloc(10 * sizeof(int));
}

затем вы можете освободить каждую строку матрицы (при условии, что вы правильно инициализировали каждую строку):

for (int i=0; i<10; ++i) {
  free(mat[i]);
}

затем освободите указатель верхнего уровня:

free(mat);

По второму вопросу: если вы выделите память и будете ее использовать, вы измените эту память, которая не будет «возвращена». даже если вы освободите его (хотя вы больше не сможете получить к нему надежный / переносимый доступ).

Note: malloc верхнего уровня используетsizeof(int*) как вы выделяете указатель наintс неints - размерint* а такжеint не гарантируется быть одинаковым.

то есть все строки имеют одинаковую длину, вы можете рассмотреть следующие вопросы:

Accessing it manually, i.e. just treat it as a 1D array of values, and keep a separate width value. To access an element at (x,y) use mat[y * width + x]. If you really want the convenience of mat[y][x], you can improve it by doing a single call to malloc() that allocates both the pointer array and all the rows, then initializing the pointers to point at each row. This has the advantage that it can all be free:ed with a single free(mat); call.

Второй подход будет выглядеть примерно так:

double ** matrix_new(size_t width, size_t height)
{
  double **p = malloc(height * sizeof *p + width * height);
  double *e1 = (double *) (p + height);
  size_t i;

  for(i = 0; i < height; ++i)
    p[i] = e1 + i * width;
  return p;
}

Примечание: вышеприведенное не проверено, и перед использованием, очевидно, следует проверить работоспособность кода.p.

 03 сент. 2014 г., 19:50
если вы освобождаете только указатель верхнего уровня, буферы, указанные внутренним уровнем, не ссылаются, освобождаются ли они по умолчанию каким-либо сборщиком мусора. или они должны быть явно освобождены ???

Ваш ответ на вопрос