如何称呼原来的“operator new”?如果我超载了呢?

发布于 2024-10-01 12:28:50 字数 686 浏览 3 评论 0原文

假设我需要重载全局 ::operator new() 用于为每个分配的对象存储额外的数据。所以基本上它会这样工作:

  • 对于每次调用全局 ::operator new() ,它将获取传递的对象大小并添加额外数据的大小,
  • 它将分配一个内存块< /em> 的大小在上一步中推导出来,
  • 它将把指针偏移到块中未被额外数据占用的部分,并将该偏移值返回给调用者

::operator delete() 将执行相同的操作相反 - 移动指针、访问额外数据、释放内存。

现在的问题是如何分配内存?当然,我可以调用 malloc() 或一些特定于平台的函数(通常是这样做的)。但通常当我需要在 C++ 中分配原始内存时,我会调用 ::operator new()。我可以调用原始的 ::operator new() 从重载的全局 ::operator new() 内部进行内存分配吗?

Suppose I need to overload global ::operator new() for storing extra data with each allocated object. So basically it would work this way:

  • for each call to global ::operator new() it will take the object size passed and add the size of extra data
  • it will allocate a memory block of size deduced at previous step
  • it will offset the pointer to the part of the block not occupied with extra data and return that offset value to the caller

::operator delete() will do the same in reverse - shift the pointer, access extra data, deallocate memory.

Now the question is how do I allocate memory? Of course I can call malloc() or some platform-specific function (that's how it is usually done). But normally when I need to allocate raw memory in C++ I call ::operator new(). Can I call the original ::operator new() to do the memory allocation from inside my overloaded global ::operator new()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽容 2024-10-08 12:28:50

您无法访问它们,因为它并不是真正的超载,而是替换。当您定义自己的 ::operator new 时,旧的就会消失。差不多就是这样了。

本质上,您需要从自定义 ::operator new 调用 malloc。不仅如此,还要按照18.4.1.1/4中的指示正确处理错误:

默认行为:

——执行循环:
在循环中,首先是函数
尝试分配所请求的
贮存。尝试是否涉及
对标准 C 库的调用
函数 malloc 未指定。


返回指向分配的指针
如果尝试成功则存储。
否则,如果最后一个参数
set_new_handler() 是一个空指针,
抛出 bad_alloc。

——否则,
函数调用当前的new_handler
(18.4.2.2)。如果被调用的函数
返回,循环重复。

——循环
当尝试分配时终止
请求的存储成功或
当调用 new_handler 函数时
不返回。

You can't access them because it isn't really overloading, it's replacement. When you define your own ::operator new, the old one goes away. That's pretty much that.

Essentially, you need to call malloc from a custom ::operator new. Not only that, but also follow the directions in 18.4.1.1/4 to properly handle errors:

Default behavior:

— Executes a loop:
Within the loop, the function first
attempts to allocate the requested
storage. Whether the attempt involves
a call to the Standard C library
function malloc is unspecified.


Returns a pointer to the allocated
storage if the attempt is successful.
Otherwise, if the last argument to
set_new_handler() was a null pointer,
throw bad_alloc.

— Otherwise, the
function calls the current new_handler
(18.4.2.2). If the called function
returns, the loop repeats.

— The loop
terminates when an attempt to allocate
the requested storage is successful or
when a called new_handler function
does not return.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文