• <small id='JXSsL'></small><noframes id='JXSsL'>

    <legend id='JXSsL'><style id='JXSsL'><dir id='JXSsL'><q id='JXSsL'></q></dir></style></legend>

    <tfoot id='JXSsL'></tfoot>
      • <bdo id='JXSsL'></bdo><ul id='JXSsL'></ul>
      1. <i id='JXSsL'><tr id='JXSsL'><dt id='JXSsL'><q id='JXSsL'><span id='JXSsL'><b id='JXSsL'><form id='JXSsL'><ins id='JXSsL'></ins><ul id='JXSsL'></ul><sub id='JXSsL'></sub></form><legend id='JXSsL'></legend><bdo id='JXSsL'><pre id='JXSsL'><center id='JXSsL'></center></pre></bdo></b><th id='JXSsL'></th></span></q></dt></tr></i><div id='JXSsL'><tfoot id='JXSsL'></tfoot><dl id='JXSsL'><fieldset id='JXSsL'></fieldset></dl></div>

        我如何称呼原始的“运营商新"?如果我超载了

        时间:2023-09-17

            • <legend id='uqiYn'><style id='uqiYn'><dir id='uqiYn'><q id='uqiYn'></q></dir></style></legend>
            • <tfoot id='uqiYn'></tfoot>
                <tbody id='uqiYn'></tbody>

                  <bdo id='uqiYn'></bdo><ul id='uqiYn'></ul>

                  <i id='uqiYn'><tr id='uqiYn'><dt id='uqiYn'><q id='uqiYn'><span id='uqiYn'><b id='uqiYn'><form id='uqiYn'><ins id='uqiYn'></ins><ul id='uqiYn'></ul><sub id='uqiYn'></sub></form><legend id='uqiYn'></legend><bdo id='uqiYn'><pre id='uqiYn'><center id='uqiYn'></center></pre></bdo></b><th id='uqiYn'></th></span></q></dt></tr></i><div id='uqiYn'><tfoot id='uqiYn'></tfoot><dl id='uqiYn'><fieldset id='uqiYn'></fieldset></dl></div>
                • <small id='uqiYn'></small><noframes id='uqiYn'>

                  本文介绍了我如何称呼原始的“运营商新"?如果我超载了吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  假设我需要重载全局 ::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:

                  • 对于每次调用全局 ::operator new() 它将获取传递的对象大小并添加额外数据的大小
                  • 它将分配一个内存块,其大小在上一步推导出
                  • 它会将指针偏移到没有被额外数据占用的块部分,并将该偏移值返回给调用者
                  • 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() 将反向执行相同的操作 - 移动指针、访问额外数据、释放内存.

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

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

                  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()?

                  推荐答案

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

                  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.

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

                  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:

                  默认行为:

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

                  — 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.

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

                  — 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.

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

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

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

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

                  这篇关于我如何称呼原始的“运营商新"?如果我超载了吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:c++11 中的类型什么时候可以被 memcpyed? 下一篇:全局内存是否在 C++ 中初始化?

                  相关文章

                  最新文章

                    <tfoot id='ZKoaR'></tfoot>

                  1. <legend id='ZKoaR'><style id='ZKoaR'><dir id='ZKoaR'><q id='ZKoaR'></q></dir></style></legend>

                    <small id='ZKoaR'></small><noframes id='ZKoaR'>

                    <i id='ZKoaR'><tr id='ZKoaR'><dt id='ZKoaR'><q id='ZKoaR'><span id='ZKoaR'><b id='ZKoaR'><form id='ZKoaR'><ins id='ZKoaR'></ins><ul id='ZKoaR'></ul><sub id='ZKoaR'></sub></form><legend id='ZKoaR'></legend><bdo id='ZKoaR'><pre id='ZKoaR'><center id='ZKoaR'></center></pre></bdo></b><th id='ZKoaR'></th></span></q></dt></tr></i><div id='ZKoaR'><tfoot id='ZKoaR'></tfoot><dl id='ZKoaR'><fieldset id='ZKoaR'></fieldset></dl></div>

                    • <bdo id='ZKoaR'></bdo><ul id='ZKoaR'></ul>