2013-11-08 7 views
0

У меня есть небольшое сомнение. Я не знаю, является ли мой вопрос действительным или нет, но я помещаю его в SO. Первый вопрос: когда мы перегрузить оператор новый и оператор удаления (не для массивов) на глобальном или класса уровне, а затем, если мы обрешетка массив объектов что-то, как показано ниже:перегружать оператора new и delete

A* obj = new A[10]; 
delete []obj; 

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

void* operator new[](size_t size){} 

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

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

ответ

3

При вызове new T[n], память выделена operator new[](size_t). Если вы замените эту функцию, будет вызвана ваша замена . Если вы не заменить эту функцию, реализация по умолчанию будет называться, который, по определению :

void* 
operator new[](size_t n) 
{ 
    return operator new(n); 
} 

Другими словами, он направляет к не-массива operator new функции. Таким образом, если вы заменили operator new(), будет вызвана ваша замена .

(Но почему вы делаете new []? Я никогда не находил случай , где было бы полезно.)

+0

Таким образом, это означает, что нам не нужно перегружать 'новый []' вообще, если будет делать то же самое, что и «новый», интересно знать. Является ли эта делеция стандартной или самой распространенной версией по умолчанию 'new []'? –

+0

* "(Но почему вы делаете новый []? Я никогда не нашел случая, когда это было бы полезно.)« * - Возможно, просто проверить свои перегруженные «новые» -операторы и увидеть, что он ведет себя странно (с его точки зрения)? Или предоставить SSCCE для вопроса? –

+0

@ChristianRau Это требуется по стандарту. Вам нужно только перегрузить 'operator new []()', если вы хотите, чтобы у него было другое поведение (например, если член 'operator new()' выделяет из пула и запускается с 'assert (size == sizeof (T)); '). –

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