2016-11-08 7 views
2

以下のプログラムでは、オーバーロードされたoperator new []が呼び出されています。しかし、私がこの機能をコメントすると、私のオーバーロードされたoperator newが呼び出されています。それはdefault new []と呼ばれるべきではありませんか?新しい演算子はnewまたは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

によって呼び出されます。 [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);
    。 [...](可能な新しい表現のオーバーヘッドを含む)アレイのために必要なすべてのストレージを割り当てることnew[] -expressionsの配列形態によって呼び出さ

  2. void* operator new[](std::size_t count);
    。あなたはバージョンをオーバーロードする場合標準ライブラリの実装では、(1)

したがってバージョンを呼び出します(1)が、ないオーバーロードバージョン(2)、あなたの行を行う

int *t = new int[10]; 

ます標準ライブラリのoperator new []を呼び出します。しかしそれは、オーバーロードしたoperator new(size_t)を呼び出します。

0

1つの違いがあります。 "新しい"キーワードでは、生のメモリだけを割り当てます。結果は、そのメモリ内に作成された実際の生きているオブジェクトです。関数を呼び出さなければ、newはregularと呼ばれています。

関連する問題