Использование PPL с новым переопределением оператора

У меня есть большой (миллион строк) проект VC++, и я хотел бы начать использовать PPL (библиотеку параллельных шаблонов) в проекте. В проекте реализованы настраиваемые глобальные операторы new и delete. Проблема в том, что PPL (в отладочной сборке) использует собственный

оператор void* new[](size_t cb, int nBlockUse, const char* szFileName, int nLine)

но затем, когда он освобождается, вызывается мой оператор delete(void*), и, поскольку расположение памяти совершенно другое, это не работает.

Мой вопрос заключается в том, есть ли способ использовать PPL в сборке отладки, не отказываясь от моих глобальных операторов new и delete. Есть веские причины для того, чтобы иметь эти глобальные новые и удаляемые переопределения, удаление их из моего проекта в настоящее время не вариант.


person Lonnie Chrisman    schedule 04.09.2014    source источник


Ответы (1)


Это была ошибка в PPL в Visual C++ 2010; это было исправлено в Visual C++ 2012.

Вы можете обойти это, написав свои собственные заменяющие операторы отладки new и delete, которые вызывают ваши собственные пользовательские операторы new и delete:

void __cdecl operator delete(
    void*       block,
    int const   block_use,
    char const* file_name,
    int const   line_number
    )
{
    return operator delete(block);
}

void __cdecl operator delete[](
    void*       block,
    int const   block_use,
    char const* file_name,
    int const   line_number
    )
{
    return operator delete[](block);
}

void* __cdecl operator new(
    size_t const size,
    int const    block_use,
    char const*  file_name,
    int const    line_number
    )
{
    return operator new(size);
}

void* __cdecl operator new[](
    size_t const size,
    int const    block_use,
    char const*  file_name,
    int const    line_number
    )
{
    return operator new[](size);
}
person James McNellis    schedule 05.09.2014
comment
Извините, я должен был упомянуть, что использую VS2013. Когда я пытаюсь переопределить оператор void* __cdecl new[]( size_t const size, int const block_use, char const* file_name, int const line_number), компоновщик сообщает LIBCMTD.lib(dbgnew.obj): error LNK2005: void * __cdecl operator new [](unsigned __int64,int,char const *,int) (??_U@YAPEAX_KHPEBDH@Z), уже определенный в UDMemory.obj Параметр компоновщика /FORCE:MULTIPLE также не решает проблему. - person Lonnie Chrisman; 07.09.2014