Удаление указателя, который содержит указатель, указывающий на другое местоположение - PullRequest
0 голосов
/ 22 марта 2020

Недавно, когда я писал код для реализации стека. Я сталкивался с этим сомнением. Пожалуйста, помогите мне пройти через это. Код написан так, как показано ниже.

struct Stack{
  int top;
  int capacity;
  int *array;
}

Stack* createStack(int capacity){
  Stack *S = new Stack;

  S->capacity = capacity;
  S->top = -1;
  S->array = new int[capacity];

  return S;
}

void Delete(Stack *S){
  delete S->array;
  delete S;
}

Теперь мои сомнения заключаются в функции удаления. Как мы видим, S указывает на блок памяти типа Stack. Внутри которого есть еще один указатель, указывающий на массив блоков типа int. Что произойдет, если S-блок будет удален напрямую без удаления блока массива?

1 Ответ

3 голосов
/ 22 марта 2020

Что произойдет, если удалить блок S напрямую, не удаляя блок массива?

Объект S будет уничтожен, и эта память будет освобождена. Больше ничего не случится. В частности, память, указанная array, не будет освобождена. Если член был единственным указателем на эту память, то освободить его будет невозможно. Это называется утечкой памяти.

PS Поведение программы не определено, если delete используется для указателя, который не был возвращен new. В примере программы delete используется для указателя, возвращаемого new[]. Поведение программы не определено. delete[] должен использоваться вместо.

...