Memory management 重载运算符new,这样代码的一部分使用重载运算符,而其余部分使用默认运算符

Memory management 重载运算符new,这样代码的一部分使用重载运算符,而其余部分使用默认运算符,memory-management,malloc,new-operator,overloading,Memory Management,Malloc,New Operator,Overloading,我正在开发运行时数据流/模型分析器模块的内存分配器/快照组件。我们的一部分需求是将测试程序的数据结构分配到我们控制的自定义内存区域中。为了避免更改测试程序,我们认为必须定义自己的malloc/frees,而实际的快照/运行时检查器模块将使用系统malloc,由于Stackoverflow,我们将通过LD_预加载机制获得其指针。然而,真正的问题在于新运营商。我们可以采用与以前相同的方法,但new可能会在内部使用malloc,但还需要查看kernel/libstdc++代码来验证这一点,因此我们可能

我正在开发运行时数据流/模型分析器模块的内存分配器/快照组件。我们的一部分需求是将测试程序的数据结构分配到我们控制的自定义内存区域中。为了避免更改测试程序,我们认为必须定义自己的malloc/frees,而实际的快照/运行时检查器模块将使用系统malloc,由于Stackoverflow,我们将通过LD_预加载机制获得其指针。然而,真正的问题在于新运营商。我们可以采用与以前相同的方法,但new可能会在内部使用malloc,但还需要查看kernel/libstdc++代码来验证这一点,因此我们可能最终会在测试程序和运行时检查器模块中实际使用malloc。 我能想出的一个解决方案是重载运算符new,以某种方式找到调用方上下文。我通常有一个类似于C++的对象,在构造函数中设置递归标志>在析构函数中清除它,使用上下文中的MALOC,我们的GLUCB-MALLC分配内存,然后使用新的放置语法来确保调用构造函数。 我真的很喜欢C++构造函数实际调用的指针,我确信它是新的一部分,因为它返回了指向该对象的指针,但是我看到的VSCRT使用MALLC的唯一实现,没有明显的构造函数调用。 我的问题是: 我想要一些关于我的总体想法的反馈? 2何时调用构造函数

最好的, Subramanian

当你重载新操作符时,你只调用构造函数,而不是调用构造函数。我相信,编译器是通过在new返回的空间上发出调用构造函数所需的代码来完成的——类似于“delete:仅在调用析构函数后释放分配的空间”

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


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

似乎我在堆栈溢出中搜索得不够,在分配内存的新操作符和调用构造函数的新操作符之间有一个非常细微的区别。谢谢Templatetypedef,他的评论启发了我和Attila。