C++ 我怎样才能禁止使用;新";在C+的某些部分+;密码?
是否有可能防止在代码中的某些点使用新代码 我正在开发的遗留代码要求在引导完成后没有动态内存分配。我们现在想测试一下 如果我从零开始开发,那么我可以编写自己的包装器并使用它,或者在公共基类中重载运算符new 有没有一种方法可以重载全局新建,然后称之为全局新建?不是重载,而是替换全局新建确实是可能的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
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
之间可以有一个()
参数列表。您的宏总是添加该参数,因此如果存在另一个参数列表,它总是会中断。从字面上说,你不能想出一个反例。