проблема malloc? - PullRequest
       7

проблема malloc?

3 голосов
/ 23 февраля 2011

Здравствуйте, я использую malloc () для создания буфера, подобного этому, где buffer - это символ *

buffer = (char*)malloc(chunksize+1);
  for (k = 0; k < chunksize; k++) {
    buffer[k] = (char) (j+k);
  }

однако в отладчике я вижу буфер [3], например, это символ, в котором я записал, но буферный буфер пуст (много пробелов). Но во второй раз, когда я записываю вещи в буфер после освобождения (buffer), он показывает содержимое, которое я написал в первый раз, и перезаписывает его. Кто-нибудь может сказать мне, почему? Спасибо !!

Ответы [ 3 ]

8 голосов
/ 23 февраля 2011

Вообще говоря, реализации malloc работают, получая большой кусок памяти из ОС, а затем выделяя ее биты, когда вы запрашиваете буферы. Это связано с тем, что получение памяти из ОС происходит относительно медленно.

В качестве меры безопасности ваша ОС предоставит malloc пустую память (заполненную 0 или другим повторяющимся значением). Вы не хотели бы, чтобы один процесс мог прочитать остатки несвязанного процесса.

Однако у malloc таких проблем нет, потому что он обслуживает только этот блок одному процессу. Неважно, видите ли вы свои собственные уходы (по крайней мере, не из POV безопасности).

Так что случилось, что вы неправильно разместили буфер и увидели его изначально пустым. Затем вы освободили его и запросили «другой» буфер, и malloc, похоже, снова передал вам ту же память, на этот раз содержащую значения, которые вы в ней оставили.

Такое «совпадение» получения одной и той же памяти дважды не является маловероятным, поскольку у malloc есть веская причина для повторного использования недавно использованной памяти, где это возможно, - скорее всего, она находится в кеше.

Вы можете подумать, что это не имеет значения для вас, потому что обычно вы не читаете из недавно выделенной памяти. Но это важно для malloc, потому что обычно malloc хранит свои собственные служебные данные рядом с буфером. Также может иметь значение, если с удалением памяти из кеша связаны затраты - если вас можно «обмануть», чтобы снова и снова использовать одну и ту же память, тогда это происходит меньше.

1 голос
/ 24 февраля 2011

Одной из проблем может быть то, что вы пытаетесь напечатать ваш char буфер с printf или его эквивалентом? Вам не хватает назначить

buffer[chunksize] = 0;

Таким образом, ваш буфер не очень хорошо завершен. За этим может быть что-нибудь, например, '\r'.

Если, с другой стороны, buffer не представляет для вас строку, лучше использовать другой базовый тип, вероятно, unsigned char.

0 голосов
/ 23 февраля 2011

Ваш код правильный.Проблема может быть в какой-то части кода, которую вы не показывали, если вы обеспокоены тем, что перезаписали какую-то плохую память.Например, если буфер является указателем на массив не-char, в этом случае арифметика указателя , которую вы используете, приведет к плохому доступу к памяти (повреждение).Вы можете использовать следующую программу для справки:

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

int main ()
{
  const size_t chunksize = 15;
  size_t k;
  char *buffer;

  buffer = malloc (chunksize + 1);
  memset (buffer, 0, chunksize + 1);

  for (k = 0; k < chunksize; ++k)
    {
      buffer[k] = '0' + (char)k + 49;
    }

  for (k = 0; k < chunksize; ++k)
    {
      printf ("%lu = %c\n", k, buffer[k]);
    }

  free (buffer);

  return 0;
}

Вывод:

0 = a
1 = b
2 = c
3 = d
4 = e
5 = f
6 = g
7 = h
8 = i
9 = j
10 = k
11 = l
12 = m
13 = n
14 = o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...