0

我已经将我的运营商 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

我的程序主要使用这种类型的 new 运算符,这就是我比较关心它的原因。但是,编译器给了我“宏名称 [-Werror] 后缺少空格”的错误消息。我试图玩弄“#define new[] DEBUG_NEW2”。在某些情况下,它可以编译,但我不会被覆盖 new[] 。

4

1 回答 1

2

这里的问题是开头的那一行#define new[]

您正在尝试创建一个名为 的宏new[]

首先,这是非法的,因为宏名称必须是有效标识符,这意味着它只能包含字母、下划线、数字,并且不能以数字开头。

其次,您试图为关键字赋予新的含义。这是不允许的,这意味着您的程序无效或给出未定义的行为。

无需添加这样的宏来重载运算符 new[]。事实上,你需要做的就是void* operator new[](size_t)在想要的范围内声明一个带有签名的函数,它会被自动调用以进行数组分配。

于 2013-01-29T16:43:24.020 回答