【问题标题】:C++ Custom memory allocation link error in VS2012VS2012中的C++自定义内存分配链接错误
【发布时间】:2013-08-04 16:18:31
【问题描述】:

当我尝试覆盖 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:\用户\文档\视觉工作室 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;
}

有人可以帮忙吗?

【问题讨论】:

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


    【解决方案1】:

    库未按正确顺序链接

    尝试在文件顶部添加

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

    否则按照these 的说明进行操作。

    【讨论】:

    • 太棒了!您能否详细说明一下这个问题 - 可能是针对一般问题?这是仅限于VS的问题吗?你的线路是做什么的?是什么导致了这个问题?谢谢
    • @user997112 当 MFC 和 CRT 碰巧以不正确的顺序获取链接时,newdelete 的重载严重失败。微软页面详细解释了原因。那些pragma 指令是让链接器起飞那些库是的,据我所知,这仅发生在 VC++ 上。
    【解决方案2】:

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

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

    【讨论】:

    • 您好-您能否详细说明 DLL 选项与静态选项的区别/后果?谢谢
    猜你喜欢
    • 2018-06-28
    • 2019-08-11
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多