как правильно удалить указатель на массив

Как предложено здесь :

Get-Content tmp.log | Out-File -Encoding UTF8 new.log

9
задан david 8 January 2016 в 16:18
поделиться

6 ответов

Требование сопоставить new [] с delete [] технически верно.

Однако намного лучше (по крайней мере, на мой взгляд ), означало бы забыть, что вы когда-либо слышали о new [] , и никогда не использовать его снова. Я почти уверен, что прошло (по крайней мере) 10 лет с тех пор, как я в последний раз использовал new [] , и если бы я очень хорошо понимал ситуацию, я бы остановился даже раньше. Практически в любое время, когда вы даже подумаете об использовании new [] , std :: vector (или, возможно, std :: deque ) будет лучшим выбором. .

Если вы пытаетесь создать что-то примерно эквивалентное вектору или deque , вы не делаете этого » Обычно для этого тоже нужно использовать новый [] . Они способ (по крайней мере, обычно, хотя это можно изменить с помощью специального класса Allocator ) заключается в выделении «сырого» хранилища с помощью оператора new (что в значительной степени похоже на ] malloc - вы просто указываете ему размер, и он дает вам столько байтов памяти). Затем вы используете оператор размещения new для создания объектов в этом пространстве и явно вызываете деструктор объекта для уничтожения объектов в этом пространстве.

В качестве одного примера, это то, что позволяет std: : vector для поддержки резерва , который позволяет выделить дополнительное пространство, что выиграло ' Их можно превратить в объекты, пока вы не вызовете что-то вроде push_back или emplace_back , чтобы создать реальный объект в выделенном вами пространстве.

Когда вы используете new [] ], он должен создавать объекты указанного типа, заполняющие все выделенное вами пространство. Вы не можете создать что-то вроде push_back , которое добавляет новый объект в коллекцию, потому что коллекция всегда уже «полная». Все, что вы можете сделать, это выделить новую коллекцию, которая больше старой (так что каждое добавление к коллекции будет O (N) вместо амортизированного O (1), поддерживаемого std :: vector - a огромная потеря эффективности).

он должен создавать объекты указанного типа, заполняющие все выделенное вами пространство. Вы не можете создать что-то вроде push_back , которое добавляет новый объект в коллекцию, потому что коллекция всегда уже «полная». Все, что вы можете сделать, это выделить новую коллекцию, которая больше старой (так что каждое добавление к коллекции будет O (N) вместо амортизированного O (1), поддерживаемого std :: vector - a огромная потеря эффективности).

он должен создавать объекты указанного типа, заполняющие все выделенное вами пространство. Вы не можете создать что-то вроде push_back , которое добавляет новый объект в коллекцию, потому что коллекция всегда уже «полная». Все, что вы можете сделать, это выделить новую коллекцию, которая больше старой (так что каждое добавление к коллекции будет O (N) вместо амортизированного O (1), поддерживаемого std :: vector - a огромная потеря эффективности).

19
ответ дан 4 December 2019 в 06:22
поделиться

Если вы выделяете массив объектов с помощью оператора new [] , тогда вы должны использовать оператор delete [] и, следовательно, не-массив new можно использовать только с не-массивом delete .

int *a = new int[10];
int *b = new int;

delete [] a;
delete b;
5
ответ дан 4 December 2019 в 06:22
поделиться

Если вы используете новый <тип> [] , вы должны выполнить delete [] . Это достаточно простое правило, и его стоит запомнить.

3
ответ дан 4 December 2019 в 06:22
поделиться

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

foo = new int [10];  // so when you open the front door
delete [] foo;       // please remember to close the front door.

foo = new int;       // and when you open the back door
delete foo;          // please remember to close the back door.

Не путайте их!

2
ответ дан 4 December 2019 в 06:22
поделиться

Каждый раз, когда вы new редактируете массив, вы используете delete [] . Иногда вы обновляете массив, используя new - тогда вам все равно нужно использовать delete [] - выхода нет. Так что это не совсем правило «используйте delete [], когда вы new [] 'ed», а скорее «используйте delete [] при удалении массива».

typedef int array[5];

int *a = new array;
delete[] a; // still delete[] !
2
ответ дан 4 December 2019 в 06:22
поделиться

Microsoft XNA Game Studio

Плюсы:

  • Использует языки .NET; управляемая память, простота среды Visual Studio и т. д.
  • Хорошее сочетание высокого и низкого уровня
  • Очень хорошо поддерживает как 2D, так и 3D
  • Доказано; посмотрите на Xbox Live Arcade, все эти игры созданы на XNA
  • Игры могут быть легко запущены на сетевой Xbox

Минусы:

  • Использует языки .NET; не может использовать Java, C ++ и т. д.
  • Ресурсов (например, книг) пока не так много, хотя их легко изучить и использовать, так что это не может быть проблемой
  • Только для Windows. Mono (в Linux) вообще не поддерживает XNA.
  • XNA 3.0 был выпущен менее чем через год после версии 2.0, и теперь мы находимся на уровне 3.1; частые изменения, подобные этим, могут затруднить документацию, т.е. книги быстро устаревают, и многие вещи ломаются при обновлении игры 2.0 до игры 3.0.
8
ответ дан 4 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

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