C Вопрос для начинающих: арифметика с указателями> очистка после завершения - PullRequest
5 голосов
/ 11 мая 2011

Я медленно овладеваю указателями. Но у меня есть еще несколько вопросов.

Возможно ли вызвать утечку памяти при использовании арифметики с указателем, потому что вы смещаете фактическую позицию, на которую указывает указатель?

Я имею в виду, если, скажем, я считаю в обратном порядке, чтобы скопировать строковый символ на символ, нужно ли мне считать вниз, чтобы C "знал", куда указатель использовался для указания?

Спасибо Frank

Ответы [ 4 ]

8 голосов
/ 11 мая 2011

Утечка памяти возможна при использовании malloc() или аналогичных функций и без вызова free(), когда это необходимо.free() всегда должен вызываться с указателем, возвращаемым malloc(), так что да, если вы делаете что-то вроде этого:

int* ptr = malloc(sizeof(int));
free(ptr + 1);

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

8 голосов
/ 11 мая 2011

Память выделяется в куче.Указатель - это просто указатель на место в памяти.Вам нужно знать адрес начала выделенной памяти, чтобы освободить ее позже.

Это связано с тем, что система управления памятью должна помнить информацию о выделенной памяти (например, сколько было выделено), чтобы она знала, сколько освободить позже, и чтобы она не выделяла тот же блок другомуMalloc Call.Начальный адрес памяти определяет его.

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

int *x = malloc(...);
int *y = x;

... pointer arithmetic with y

free(x);
4 голосов
/ 11 мая 2011

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

Вам следует использовать другой указатель и сохранить исходныйссылка на выделенную память.Например:

 char *pointer = (char*)malloc (SIZE);    /*alloc space for storing a string of size SIZE*/
 char *pointer2 = pointer;
 int i;
 for (i = 0 ; i < SIZE ; i++){
      pointer2 += 1;
      //you are modifying the second pointer so you always keep a reference to the allocated memory(pointer)
 }

 //now you can call free on your memory
 free(pointer);
1 голос
/ 11 мая 2011

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

Это утечка памяти, независимо от того, были ли указанные данные выделены с помощью malloc () или статически.Утечки динамической памяти с помощью malloc (), тем не менее, опасны, тогда как утечки статической памяти безвредны.

Обратите внимание, что указание за пределы массива - неопределенное поведение: может произойти все что угодно.Выполнение арифметики с указателями над указателями, указывающими на разные массивы, также является неопределенным поведением.

Некоторые примеры неопределенного поведения:

typedef struct
{
  char array1 [6] = "hello";
  char array2 [6] = "world";
} HelloWorld_t;


HelloWorld_t hw;
const char* ptr = hw.array1;
ptr += 6; /* undefined behavior, out of bounds of the original array */
puts(ptr); /* anything can happen here: the program may crash */
puts(array2 - 6); /* also undefined behavior */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...