VS2012中的C ++自定义内存分配链接错误

时间:2013-08-03 12:53:48

标签: c++ visual-studio visual-c++ visual-studio-2012

当我尝试覆盖VS2012中的默认内存分配函数时,我收到以下链接器错误:

  

1> Main.obj:错误LNK2005:“void * __cdecl operator new(unsigned   int)“(?? 2 @ YAPAXI @ Z)已在MSVCRTD.lib中定义(MSVCR110D.dll)   1> Main.obj:错误LNK2005:“void __cdecl operator delete(void *)”   (?? 3 @ YAXPAX @ Z)已在MSVCRTD.lib中定义(MSVCR110D.dll)   1> c:\ users \ documents \ visual studio   2012 \ Projects \ CustomMemoryAllocator \ Debug \ CustomMemoryAllocator.exe:   致命错误LNK1169:找到一个或多个多重定义的符号

这是我的代码(我没有得到intellisense错误):

#include <iostream>

using namespace std;

void *operator new(size_t size){
    if(void *mem = malloc(size)){
        cout << "allocated memory" << endl;
        return mem;
    }
    else{
        throw bad_alloc();
    }
}

void operator delete(void* mem) throw() {
    cout << "deleting" << endl;
    free(mem);
}

int main(){
    cout << "test";
    int* a = new int(4);
    delete a;
    int b = 0;
    cin >> b;
}

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

图书馆未按正确顺序链接

尝试在文件顶部添加

#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/nodefaultlib:libcd.lib")

请遵循these说明。

答案 1 :(得分:1)

尝试使用DLL而不是静态链接库。转到项目属性/ C ++ /代码生成/运行时库,然后选择DLL选项。

Windows调用DLL或EXE模块。不允许模块多次定义符号,但一个进程使用的两个不同模块可以定义相同的符号。使用DLL时,在您和MSVC模块中都定义了运算符new(),这不会导致错误。