Подтвердить что ты не робот

Разница между удалением и удалением [] в С++

Возможный дубликат:
удалить vs delete [] в С++

Я написал класс, содержащий два указателя, один - char* color_ и один в vertexesset* vertex_, где vertexesset - это класс, который я создал. В деструкторе, который я написал в начале

delete [] color_;
delete [] vertex_;

Когда дело дошло до деструктора, это дало мне ошибку сегментации.

Затем я изменил деструктор на:

delete [] color_;
delete vertex_;

И теперь это прекрасно работает. В чем разница между двумя?

4b9b3361

Ответ 1

Вы delete [], когда вы new задали тип массива и delete, когда вы этого не сделали. Примеры:

typedef int int_array[10];

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

delete a;
delete[] b;
delete[] c; // this is a must! even if the new-line didn't use [].

Ответ 2

delete и delete[] - это не одно и то же! Wikipedia объясняет это, если кратко. Короче говоря, delete [] вызывает дескриптор для каждого элемента в выделенном массиве, а delete предполагает, что у вас есть ровно один экземпляр. Вы должны выделить массивы с помощью new foo[] и удалить их с помощью delete[]; для обычных объектов используйте new и delete. Использование delete[] в не-массиве может привести к хаосу.

Ответ 3

  • Если вы выделяете с помощью malloc(), вы используете free()
  • Если вы выделяете новый, вы используете delete
  • Если вы назначаете новый [], вы используете delete []
  • Если вы создаете с помощью размещения-new, вы вызываете деструктор direct
  • Если имеет смысл использовать вектор, а не новый [], то используйте его
  • Если имеет смысл использовать смарт-указатели, то используйте их и не утруждайте себя вызовом delete (но вам все равно нужно позвонить new). Соответствующее удаление будет в интеллектуальном указателе.

https://isocpp.org/wiki/faq/freestore-mgmt

Ответ 4

Вы должны использовать delete [], если вы выделили память в куче с помощью оператора new [] (например, динамический массив).

Если вы использовали оператор new, вы должны использовать оператор delete без квадратных скобок.

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

Ответ 5

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

int * p;
p=new int;

// now to free the memory 
delete p;

Но когда мы выделили память для массива таких объектов, как

int * p= new int[10]; //pointer to an array of 10 integer

чтобы освободить память, равную 10 целым числам:

 delete []p;

ПРИМЕЧАНИЕ. Можно освободить память даже с помощью delete p;, но она освободит только память первого элемента.

Ответ 6

Если у вас Эффективная часть С++ часть 1, обратитесь к пункту № 5: используйте ту же форму в соответствующих использованиях новых и удалите.

Ответ 7

И теперь это прекрасно работает.

Более того, если это удастся, и вы уверены, что он действительно работает?

Деструктор для каждого объекта должен быть вызван, оператор delete[] использует информацию, установленную new[], чтобы определить, сколько объектов уничтожить. Таким образом, хотя delete сам по себе может восстановить память (хотя независимо от того, работает она или нет, зависит от реализации), он не может вызывать деструктор для каждого выделенного объекта.

Возможно, информация о том, как объект был выделен для включения, когда new или new[] вызывается так, что правильная форма удаления используется независимо, но опять же это зависит от реализации и не гарантируется.

Ответ 8

Raymond Chen предоставляет подробное описание того, как масштабирующее и векторное удаление работает в своем блоге под названием Несовпадение скалярных и векторных новых и удаление.

Здесь ссылка на статью InformIT, которая неправильно связана в приведенной выше статье: http://www.informit.com/articles/article.aspx?p=30642

Ответ 9

Кроме того (очевидно, моя скорость набора должна быть улучшена:), рассмотрите не используя указатели, если вам не нужно действительно. например char* можно заменить на std::string, и если ваш член vertexesset не является полиморфным, вы можете сделать его объектом-членом. В этом случае вам вообще не понадобится delete