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

3
当我尝试在VS2012中覆盖默认内存分配函数时,出现以下链接器错误:
1> Main.obj:error LNK2005:“void * __cdecl operator new(unsignedint)”(?? 2 @ YAPAXI@Z)已在MSVCRTD.lib(MSVCR110D.dll)中定义
1> Main.obj:.error 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:fatal error 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;
}

有人能帮忙吗?

这段内容与IT技术无关。
2个回答

2

库没有按正确的顺序链接

尝试将以下内容添加到文件顶部

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

否则请按照这些说明进行操作。

太好了!您能详细说明一下问题吗?也许是针对一般性问题?这个问题是否仅限于VS?您的代码行是做什么的?是什么导致了这个问题?谢谢。 - user997112
1
@user997112,当MFC和CRT以错误的顺序链接时,newdelete的重载会严重失败。微软页面详细解释了原因。那些pragma指令是为了让链接器卸载这些库。据我所知,这只会在VC++上发生。 - P0W

1
尝试使用DLL代替静态链接库。转到项目属性/C++/代码生成/运行时库并选择DLL选项。 Windows将DLL或EXE称为模块。一个模块不允许多次定义一个符号,但是一个进程使用的两个不同模块可以定义相同的符号。当使用DLL时,operator new()在您和MSVC模块中都被定义,这不会导致错误。

1
你好- 你能详细说明一下DLL选项和静态选项的区别/后果吗?谢谢。 - user997112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接