重载operator new,使得部分代码使用重载运算符,而其余代码使用默认值

时间:2012-04-10 20:18:47

标签: memory-management malloc new-operator overloading

我正在研究运行时数据流/模型分析器模块的内存分配器/快照组件。我们要求的一部分是将测试程序的数据结构分配在我们控制的自定义内存区域中。为了避免,改变测试程序,我们认为我们必须定义自己的malloc / frees,实际的快照/运行时检查器模块将使用系统malloc,它的指针我们将通过LD_PRELOADED机制获得(感谢Stackoverflow)。然而,真正的问题是运营商新的问题。我们可以像以前一样使用相同的路径,但是新的可能在内部使用malloc(但是要查看kernel / libstdc ++代码来验证这一点),因此我们最终可能会将testoc用于测试程序以及运行时检查程序模块。 我能提出的一个解决方案是重载operator new以某种方式找到调用者上下文。 (我通常有一个语义,比如创建一个C ++对象<在构造函数中设置递归标记>在析构函数中清除它),使用我们的malloc我们的glibc malloc基于上下文分配内存,然后使用new的放置语法来确保构造函数被调用。 我真的想要一些关于何时实际调用C ++构造函数的指针,我90%确定它是new的一部分因为返回一个指向该对象的指针,但是我见过的唯一的new实现(VSCRT)使用malloc并且没有明显的构造函数调用。 我的问题是: 1)我想对我的总体想法提出一些反馈意见? 2)什么时候完全调用构造函数?

最佳, 萨勃拉曼尼亚

1 个答案:

答案 0 :(得分:0)

你重载new运算符,你只有overload the memory allocation process,而不是对构造函数的调用(我相信,这是由编译器通过发出必要的代码来调用构造函数来完成的。由new返回的空格 - 类似于`delete:只释放已分配的空间(在已经调用析构函数之后)。

因此,对您的问题的快速回答是您可以重载运算符new / delete以使用您的特定内存分配方案(例如,通过malloc / free)并且生成的可执行代码将处理对象创建。

注意:构造函数不需要任何额外的参数(你甚至不能为析构函数提供一个参数) - 当构造函数被调用时,内存被成功分配(否则构造函数不会被调用)开始)