Как предложено здесь :
Get-Content tmp.log | Out-File -Encoding UTF8 new.log
Требование сопоставить 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 огромная потеря эффективности). Если вы выделяете массив объектов с помощью оператора new []
, тогда вы должны использовать оператор delete []
и, следовательно, не-массив new
можно использовать только с не-массивом delete
.
int *a = new int[10];
int *b = new int;
delete [] a;
delete b;
Если вы используете новый <тип> []
, вы должны выполнить delete []
. Это достаточно простое правило, и его стоит запомнить.
Вы вошли в парадную дверь и оставили ее открытой. Затем вы прошли к задней двери и попытались закрыть ее, но разбили ее, потому что она уже была закрыта.
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.
Не путайте их!
Каждый раз, когда вы new
редактируете массив, вы используете delete []
. Иногда вы обновляете массив, используя new
- тогда вам все равно нужно использовать delete []
- выхода нет. Так что это не совсем правило «используйте delete [], когда вы new [] 'ed», а скорее «используйте delete [] при удалении массива».
typedef int array[5];
int *a = new array;
delete[] a; // still delete[] !
Плюсы:
Минусы: