2016-11-08 6 views
2

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

#include <iostream> 
#include <stdlib.h> 
using namespace std; 

void *operator new (size_t os) 
{ 
    cout<<"size : "<<os<<endl; 
    void *t; 
    t=malloc(os); 
    if (t==NULL) 
    {} 
    return (t); 
} 

//! Comment This below function 
void* operator new[](size_t size){ 
    void* p; 
    cout << "In overloaded new[]" << endl; 
    p = malloc(size); 
    cout << "size :" << size << endl; 
    if(!p){ 
    } 
    return p; 
} 

void operator delete(void *ss) {free(ss);} 

int main() 
{ 
    int *t=new int[10]; 
    delete t; 
} 
+0

@ Jarod42 интересной. [clang-3.5 действительно вызывает это.] (http://melpon.org/wandbox/permlink/kDxBGkv2bLVBUkj3) – mindriot

+0

@Deduplicator Действительно, [удаление «-O2'» исправляет «это» (http: //coliru.stacked- crooked.com/a/12a030edc1905452) – mindriot

ответ

3

Глядя на the reference, мы видим:

  1. void* operator new (std::size_t count);
    Вызывается не-массив новых выражений для выделения памяти, необходимой для одного объекта. [...]

  2. void* operator new[](std::size_t count);
    Вызывается виде массива new[] -expressions выделить все необходимое для хранения массива (в том числе возможных накладных расходов нового выражения). Стандартная реализация библиотеки вызовов версии (1)

Таким образом, если вы перегружать версии (1), но сделать не перегрузки версии (2), ваша линия

int *t = new int[10]; 
будет

вызовите стандартную библиотеку operator new []. Но это, в свою очередь, вызывает operator new(size_t), который вы перегрузили.

0

Существует одна разница между ними. С помощью «нового» ключевого слова он просто выделяет необработанную память. Результат - настоящий живой объект, созданный в этой памяти. Если вы не вызываете свою функцию, новый получает вызов regular.