0

我正在使用带有英特尔 C/C++ 编译器的 Visual Studio 2012,并且在进入如下行时:

x = new X();

然后我看到如下代码:

#ifdef _SYSCRT
#include <cruntime.h>
#include <crtdbg.h>
#include <malloc.h>
#include <new.h>
#include <stdlib.h>
#include <winheap.h>
#include <rtcsup.h>
#include <internal.h>

void * operator new( size_t cb )
{
    void *res;

    for (;;) {

        //  allocate memory block
        res = _heap_alloc(cb);

        //  if successful allocation, return pointer to memory

        if (res)
            break;

        //  call installed new handler
        if (!_callnewh(cb))
            break;

        //  new handler was successful -- try to allocate again
    }

    RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0));

    return res;
}
#else  /* _SYSCRT */

#include <cstdlib>
#include <new>

_C_LIB_DECL
int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                        _THROW_NCEE(_XSTD bad_alloc, );
                }

        return (p);
        }

#endif  /* _SYSCRT */

这是根据英特尔编译器对 new() 的定义吗?正如我可以看到英特尔如何在通过我的应用程序调试时实现 C++ 标准?

我怎么能看到 malloc.c 中的内容(而不是 malloc.h)?

编辑:我认为这是 Microsoft new() 因为 Microsoft 出现在评论中。为什么我在使用英特尔编译器时会看到 Microsoft 实施的 new()?

4

1 回答 1

0
  • 我怎么能看到 malloc.c 中的内容(而不是 malloc.h)?
  • 您看不到 malloc.c 的原因之一是您调用的函数是否在 malloc.h 中定义和声明。当您谈论 malloc.c 和 malloc.h 时,我猜您的意思是您希望看到 new() 或 malloc(sizeof(5)/sizeof(int)) 等内存分配函数。
  • 您也可能看不到这些文件,因为您的内存分配函数或任何其他间接使用内存分配器函数的函数没有错误。如果错误不存在,那么编译器不会指出您收到的错误来自 malloc.c 或 malloc.h。
  • 编译器将指向产生错误的类或文件。除非您有违反 malloc.c 或 malloc.h 函数的函数,否则您可能看不到这些文件。
于 2013-10-10T02:39:22.137 回答