3

当我尝试覆盖 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:找到一个或多个多重定义的符号

这是我的代码(我没有智能感知错误):

#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;
}

有人可以帮忙吗?

4

2 回答 2

2

未按正确顺序链接的库

尝试在文件顶部添加

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

否则请遵循这些说明。

于 2013-08-03T13:04:43.520 回答
1

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

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

于 2013-08-03T13:16:30.743 回答