Visual c++ 将PPL与新的操作员覆盖一起使用

Visual c++ 将PPL与新的操作员覆盖一起使用,visual-c++,ppl,Visual C++,Ppl,我有一个大型(百万行)VC++项目,我想开始在项目中使用PPL(并行模式库)。该项目实现了自定义全局运算符new和运算符delete功能。问题是PPL(在调试构建中)使用自己的 void*运算符new[](大小为cb,int-nBlockUse,常量字符*szFileName,int-nLine) 但是当它取消分配时,会调用我的运算符delete(void*),因为内存布局完全不同,所以这不起作用 我的问题是,是否有一种方法可以在调试构建中使用PPL,而不放弃全局new和delete操作符。有这

我有一个大型(百万行)VC++项目,我想开始在项目中使用PPL(并行模式库)。该项目实现了自定义全局运算符new和运算符delete功能。问题是PPL(在调试构建中)使用自己的

void*运算符new[](大小为cb,int-nBlockUse,常量字符*szFileName,int-nLine)

但是当它取消分配时,会调用我的运算符delete(void*),因为内存布局完全不同,所以这不起作用


我的问题是,是否有一种方法可以在调试构建中使用PPL,而不放弃全局new和delete操作符。有这些全局新的删除删除的充分理由,此时从项目中删除它们不是一个选项。

< P>这是Visual C++ 2010中PPL中的一个bug;它在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);
}

对不起,我应该提到我正在使用VS2013。当我试图覆盖void*\u cdecl运算符new[](大小常量大小,int const块使用,char const*文件名,int const行号)时,链接器会报告LIBCMTD.lib(dbgnew.obj):错误LNK2005:“void*\u cdecl运算符new[](未签名的int 64,int,char const*,int)”(_U@YAPEAX_KHPEBDH@Z)已经在UDMemory.obj中定义了/FORCE:MULTIPLE linker选项也不能解决问题。