在下面的程序中,重载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 :(得分:3)
看the reference,我们看到:
void* operator new ( std::size_t count );
由非数组新表达式调用以分配单个对象所需的存储。 [...]- 醇>
void* operator new[]( std::size_t count );
由数组形式的new[]
- 表达式调用,以分配数组所需的所有存储(包括可能的新表达式开销)。 标准库实现调用版本(1)
因此,如果您重载版本(1)但是不重载版本(2),那么您的行
int *t = new int[10];
将调用标准库operator new []
。但是,反过来调用operator new(size_t)
,你已经超载了。
答案 1 :(得分:0)
他们之间有一个区别。使用&#34; new&#34;关键字,它只是分配原始内存。结果是在该内存中创建的真实活动对象。如果你不打电话给你的功能,新的就会被定期召唤。
答案 2 :(得分:0)
operator new
调用 operator new[]
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/new_opv.cc#L32