Ошибка компиляции при перезаписи "new" - PullRequest
1 голос
/ 06 мая 2011

Я пытаюсь контролировать утечки памяти в моем коде.В моем общем заголовочном файле я добавил этот код:

    // You may need to locate mem leaks
    #define ZEL_CHECK_MEMORY_LEAKS
    #ifdef ZEL_CHECK_MEMORY_LEAKS
        #define _CRTDBG_MAP_ALLOC
        #include <cstdlib>
        #include <crtdbg.h>

        #ifdef _DEBUG
        #ifndef DBG_NEW
        #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
        #define new DBG_NEW
        #endif
        #endif  // _DEBUG

        #define zelInitMemoryCheck() \
            _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)
    #else
        #define zelInitMemoryCheck()
    #endif //ZEL_CHECK_MEMORY_LEAKS

Если я добавлю этот код, я получу эту ошибку компиляции:

1>c:\archivos de programa\microsoft visual studio 9.0\vc\include\xlocmon(283) : error C2061: syntax error : identifier '_DebugHeapTag_func'
1>        c:\archivos de programa\microsoft visual studio 9.0\vc\include\xlocmon(281) : while compiling class template member function 'size_t std::moneypunct<_Elem,_Intl>::_Getcat(const std::locale::facet **,const std::locale *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Intl=true
1>        ]
1>        c:\archivos de programa\microsoft visual studio 9.0\vc\include\xlocmon(908) : see reference to class template instantiation 'std::moneypunct<_Elem,_Intl>' being compiled
1>        with
1>        [
1>            _Elem=char,
1>            _Intl=true
1>        ]

Кроме того, в моем исходном коде яиметь это включение:

#include "core/zelCoreLib.h"
#include <boost/shared_ptr.hpp>

Где код контроля утечки памяти находится в zelCoreLib.h

Для тех, у кого нет VC9.0, это код, который "не работает"

static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
        const locale *_Ploc = 0)
        {   // return locale category mask and construct standard facet
        if (_Ppf != 0 && *_Ppf == 0)
            *_Ppf = _NEW_CRT moneypunct<_Elem, _Intl>(
                _Locinfo(_Ploc->name()), 0, true);
        return (_X_MONETARY);
        }

Кажется, это часть строковых и локальных возможностей.Кроме того, в качестве дополнительной информации я использую библиотеки Lua и LuaBind

Любая помощь будет приветствоваться

1 Ответ

3 голосов
/ 06 мая 2011

У вас есть #define new. new - это ключевое слово, и #define его использование приводит к неопределенному поведению, если вы включаете любой заголовок в стандартную библиотеку. Например, стандартная библиотека почти наверняка использует размещение new в некоторых местах, и ваш макрос приведет к поломке любого использования размещения new. Это также приведет к поломке любого конкретного класса new - и библиотека может также использовать их. Вы не можете переопределить ключевые слова и ожидать, что что-нибудь сработает.

...