C++ удаляя указатель на указатель

Имя свойства Json должно соответствовать свойствам вашего класса POJO, оно должно быть location, а не LocationObject

public class Building {
private String title;
private String description;
private String cid;
private String building_id;
private String building_number;
private String campus_code;
private String campus_name;
Location location;
ArrayList < Object > offices = new ArrayList < Object > ();

//Setters and getters have been omitted

}
20
задан Jason Baker 7 September 2008 в 03:19
поделиться

6 ответов

Да необходимо циклично выполниться по указателям, удалив индивидуально.

Причина: Что, если другой код имел указатели на объекты в Вашем массиве? Компилятор C++ не знает, если это правда или нет, таким образом, необходимо быть явными.

Для "более легкого пути", двух предложений: (1) Сделайте подпрограмму с этой целью так, по крайней мере, Вы не должны будете писать код несколько раз. (2) Используйте парадигму дизайна "интеллектуального указателя", где Вы держите массив объектов со ссылочными счетчиками, затем объекты удалены, когда на объекты больше не ссылается никакой код.

29
ответ дан 29 November 2019 в 22:58
поделиться

См. контейнер указателя повышения для контейнера, который делает автоматическое удаление содержавших указателей для Вас при поддержании синтаксиса очень близко к обычным контейнерам STL.

4
ответ дан 29 November 2019 в 22:58
поделиться

Я соглашаюсь с Jason Cohen, хотя мы можем быть немного более ясными на причине необходимости удалить Ваши указатели с циклом. Для каждого "нового" или динамического выделения памяти должно быть "удаление" освобождения памяти. Несколько раз "удаление" может быть скрыто, как с smartpointers, но это все еще там.

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

до сих пор в коде мы выделили два блока динамической памяти. Первым является просто общий интервал, вторым является массив ints.

  delete pI;
  delete [] pArr;

эти операторы удаления очищают память, которая была выделена "новым" s

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

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

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

Примечание порядок, что я выделил эту память и затем что я освободил его в обратном порядке. Это вызвано тем, что, если мы должны были сделать удаление [] ppArr; сначала мы потеряли бы массив, который говорит нам, каковы наши другие указатели. Тот блок или память были бы отданы к системе и так больше не могут надежно читаться.

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

Это, я думаю, должно быть упомянуто также. Просто, потому что Вы работаете с указателями, не означает, что память, на которую указывают те указатели, была динамично выделена. То есть просто, потому что у Вас есть указатель, не означает, что это обязательно должно быть, удаляют. Массив, который я создал здесь, динамично выделяется, но указатели указывают на локальные экземпляры ints, Когда мы удаляем это, мы только должны удалить массив.

  delete [] ppArr;

  return 0;

}

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

18
ответ дан 29 November 2019 в 22:58
поделиться

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

3
ответ дан 29 November 2019 в 22:58
поделиться

Я не знаю, почему на этот ответ так запутанно долго.

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

Вы удалили несколько адресов, но не объекты.

delete не заботится о содержимом пространства памяти, он вызывает деструктор (ы) и помечает мем как свободный.

Ему все равно, что он просто удалил кучу адресов объектов, он просто видит целочисленные значения.

Вот почему вы должны сначала пройтись по массиву! и позвони удалить для каждого элемента вы можете удалить хранилище самого массива.

Что ж, теперь мой ответ стал несколько длиннее ... .... странно ...;)

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

0
ответ дан 29 November 2019 в 22:58
поделиться

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

1
ответ дан 29 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: