0

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

最好的,Subramanian

4

1 回答 1

0

当您重载new运算符时,您只会重载内存分配过程,而不是对构造函数的调用(我相信,这是由编译器通过发出必要的代码来在返回的空间上调用构造函数来完成的new)——类似于`delete:仅释放分配的空间(在已经调用析构函数之后)。

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

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

于 2012-04-10T20:53:22.250 回答