2010-09-10 2 views
1

Можно создать дубликат:
Is there any danger in calling free() or delete instead of delete[]?Можете ли вы смешать бесплатно и конструктор в C++?

Я читал этот вопрос:
In what cases do I use malloc vs new?

Кто-то поднял, что одна из причин, чтобы использовать таНос было, если вы собираетесь использовать бесплатно.

Мне было интересно: правильно ли смешивать бесплатный вызов и инициализацию конструктора в C++?

т.е.

Могу ли я сказать:

my_type *ptr = new my_type; 
free(my_type); 

Это как-то недействительна или хуже, чем:

my_type *ptr = new my_type; 
delete my_type; 

, кроме того, что это не C++ МОГ?

Аналогичным образом, не могли бы вы сделать наоборот? Можете ли вы сказать,

my_type *ptr = (my_type *)malloc(sizeof(my_type)); 
delete my_type; 

Пожалуйста сливаться, если это дубликат, я искал, но не видел вопрос вдоль этой линии именно о таНос/удалить/новый/бесплатно спросил.

+0

Вопрос - обман (обмана). http://stackoverflow.com/questions/1612031/is-there-any-danger-in-calling-free-or-delete-instead-of-delete – Serapth

+2

Если вы хотите использовать malloc/free с объектами C++, вы можете используйте malloc и добавьте новый оператор, чтобы вызвать конструктор, а затем удалить его, и освободить память. Или создайте настраиваемый распределитель, если это применимо. –

+2

@ Vlad: Даже после использования нового места вы все равно не можете вызвать delete. Но вы можете вручную вызвать деструктор объекта перед отправкой памяти на бесплатную. –

ответ

11

Недействительный. Нет гарантии, что new будет использовать malloc или delete будет использовать free.

Кроме того, используя free вместо delete будет пропускать деструктор . Если my_type сам содержит некоторые ресурсы, они будут просочиться. Аналогично, malloc пропустит конструктор, чтобы переменная могла находиться в недопустимом состоянии.

5

Действительно ли смешивать бесплатный вызов и инициализацию конструктора в C++?

Нет, это не так.

таНос, calloc, перераспределить -> бесплатно

новый -> удалить

новый [] -> удалить []

2

Нет, это не действует. malloc (и другие функции распределения C) должны совпадать с free, new должны соответствовать delete, а new [] должны соответствовать delete []. Хотя ваш компилятор может не делать ничего по-другому, если нет деструкторного кода, это не то, на что вы должны положиться.

Главное отличие состоит в том, что new/delete вызывает конструктор и деструктор объекта; malloc и free просто рассматривают его как необработанную, нетипизированную память.

2
  1. free() не называет деструктор. Он просто освобождает память, никаких вопросов.

  2. new/delete не гарантирует использование malloc() как своего распределителя памяти; free может даже не знать о памяти, которую вы бросаете на нее

+0

_ @ tdammers_, я думаю, что формулировка вашего второго пункта немного вводит в заблуждение: почему «free» использовать * 'malloc' вообще? – stakx

+0

Ух, я не обращал внимания. Починил это. – tdammers

Смежные вопросы