哪个新运营商将被称为新的或新的[]?

时间:2016-11-08 10:03:06

标签: c++ new-operator

在下面的程序中,重载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;
}

3 个答案:

答案 0 :(得分:3)

the reference,我们看到:

  
      
  1. void* operator new ( std::size_t count );
      由非数组新表达式调用以分配单个对象所需的存储。 [...]

  2.   
  3. void* operator new[]( std::size_t count );
      由数组形式的new[] - 表达式调用,以分配数组所需的所有存储(包括可能的新表达式开销)。 标准库实现调用版本(1)

  4.   

因此,如果您重载版本(1)但是重载版本(2),那么您的行

int *t = new int[10];

将调用标准库operator new []。但是,反过来调用operator new(size_t),你已经超载了。

答案 1 :(得分:0)

他们之间有一个区别。使用&#34; new&#34;关键字,它只是分配原始内存。结果是在该内存中创建的真实活动对象。如果你不打电话给你的功能,新的就会被定期召唤。

答案 2 :(得分:0)