C++ 我怎样才能禁止使用;新";在C+的某些部分+;密码?

C++ 我怎样才能禁止使用;新";在C+的某些部分+;密码?,c++,memory,memory-management,new-operator,C++,Memory,Memory Management,New Operator,是否有可能防止在代码中的某些点使用新代码 我正在开发的遗留代码要求在引导完成后没有动态内存分配。我们现在想测试一下 如果我从零开始开发,那么我可以编写自己的包装器并使用它,或者在公共基类中重载运算符new 有没有一种方法可以重载全局新建,然后称之为全局新建?不是重载,而是替换全局新建确实是可能的 C++标准有一组预定义的新的和删除的运算符。最常用的版本有: void* operator new(std::size_t) throw(std::bad_alloc); void operato

是否有可能防止在代码中的某些点使用新代码

我正在开发的遗留代码要求在引导完成后没有动态内存分配。我们现在想测试一下

如果我从零开始开发,那么我可以编写自己的包装器并使用它,或者在公共基类中重载运算符new

有没有一种方法可以重载全局新建,然后称之为全局新建?

不是重载,而是替换全局新建确实是可能的

C++标准有一组预定义的新的和删除的运算符。最常用的版本有:

void* operator new(std::size_t) throw(std::bad_alloc); 
void  operator delete(void*) throw(); 
void* operator new[](std::size_t) throw(std::bad_alloc);  
void  operator delete[](void*) throw();
前两个版本为对象分配和释放内存,后两个版本为对象数组

如果您提供自己的版本,则称为替换标准库中的版本

如果重载运算符
new
,则应始终重载匹配运算符
delete
,即使您从未调用或使用该运算符

不,您不能“重载”全局
new
-。但是,在替换中,您可以检查表示“newallowed”的全局标志(如果未设置该标志,则引发异常),并从调用代码内部更改该标志。这对类中重载的
操作符new
没有帮助,除非您更改每个重载以同时遵守该标志。

您可能可以尝试:

#define new new(your imagination)
然后取消定义它
取决于你的情况

很好,这听起来像我在想的。然后我是否需要使用malloc来分配内存?这会调用类构造函数吗?@ dN:<代码>运算符New()/Cuff>只分配内存-C++将调用构造函数。关于如何实现
operator new()
@DanS,请参见此答案。您需要使用
operator new
以外的其他方法来分配内存,而
malloc
与其他方法一样好。还要注意的是,如果您更换
操作员新建
,您还需要更换
操作员删除
;如果使用
malloc
分配内存,则需要确保
operator delete
使用的是
free
,而不是其他内容。(尽管根据您的描述,如果只是中止的
运算符delete
不合适,我也不会感到惊讶。)请注意,根据标准,默认的
运算符new[]
运算符delete[]
必须直接转发到
运算符new
运算符delete
,因此,除非你想让它们做些不同的事情,否则你不需要更换它们。2年前的2个解决方案是更好的主意,只要它们不会破坏新的布局。使用“你的想象力”,不要破坏事物;)那一点帮助都没有。新位置看起来像
新(此处)类型
。在
new
Type
之间可以有一个
()
参数列表。您的宏总是添加该参数,因此如果存在另一个参数列表,它总是会中断。从字面上说,你不能想出一个反例。