0

Intel 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 */

これは Intel コンパイラによる new() の定義ですか? のように、アプリを介してデバッグ中に Intel が C++ 標準を実装する方法を確認できますか?

(malloc.h ではなく) malloc.c の内容を確認するにはどうすればよいですか?

編集: Microsoft がコメントに表示されるため、これは Microsoft new() だと思います。Intel コンパイラを使用しているときに Microsoft による new() の実装が表示されるのはなぜですか?

4

1 に答える 1

0
  • (malloc.h ではなく) malloc.c の内容を確認するにはどうすればよいですか?
  • malloc.c が表示されない理由の 1 つは、呼び出している関数が定義され、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 に答える