我已将我的运算符new []重写为
void* operator new[](std::size_t sz, const char *file, int line)
{
void* mem = malloc(sz);
if(mem == 0){
printf("Could not allocate the desired memory, the new operator fails\n");
std::abort();
}
printf("Allocation has been done!\n");
printf("Allocation has been done! In %s, line #%i, %p[%i]\n", file, line, mem, sz);
return mem;
}
#define DEBUG_NEW2 new[](__FILE__, __LINE__)
#define new[] DEBUG_NEW2
我的程序主要使用这种类型的新运算符,这就是为什么我更关心它。 但是,编译器给我“宏名称[-Werror]”错误消息后“丢失了空白”。我试着玩“#define new [] DEBUG_NEW2”。在某些情况下,它编译好,但我没有被覆盖的新[]然后。
答案 0 :(得分:2)
这里的问题是以#define new[]
您正在尝试创建名为new[]
。
首先,这是非法的,因为宏名称必须是有效的标识符,这意味着它只包含字母,下划线,数字,并且不能以数字开头。
其次,您试图为关键字赋予新的含义。这是不允许的,意味着您的程序无效或给出了未定义的行为。
不需要添加这样的宏来重载运算符new []。实际上,您需要做的就是在所需范围内声明一个带有签名void* operator new[](size_t)
的函数,并且它将自动调用以进行数组分配。