2014-09-04 111 views
0

我有一個很大的(百萬行)VC++項目,並且想要在項目中使用PPL(並行模式庫)。該項目實現了一個自定義的全局運算符new和operator delete函數。問題是,PPL(在調試版本)使用自己的使用PPL和操作符new override

無效*運營商新的[](爲size_t CB,詮釋nBlockUse,爲const char * szFileName,INT n線段)

,但是當它解除分配,我的運算符delete(void *)被調用,並且由於內存佈局完全不同,所以這不起作用。

我的問題是,是否有一種方法可以在調試版本中使用PPL而不會放棄我的全局新增和刪除操作符。有這些全球新的&刪除覆蓋,從我的項目中刪除他們目前不是一個選項。

回答

1

這是Visual C++ 2010中PPL中的一個錯誤;它是固定在Visual C++ 2012

您可以通過編寫自己更換調試運營商新的解決這一點,並刪除調用自己的運營商定製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); 
} 
+0

對不起,我應該已經提到我正在使用VS2013。 當我嘗試重寫 無效* __cdecl的operator new []( 爲size_t常量大小, INT常量block_use, 字符常量* FILE_NAME, INT常量LINE_NUMBER ) 鏈接器將報告 LIBCMTD。 lib(dbgnew.obj):錯誤LNK2005:已在UDMemory.obj中定義的「void * __cdecl operator new [](unsigned __int64,int,char const *,int)」(?? _ U @ YAPEAX_KHPEBDH @ Z) /強制:多鏈接器選項也不能解決問題。 – 2014-09-07 17:14:12