首页 > 解决方案 > 不使用 /NODEFAULTLIB 调用构造函数

问题描述

我正在使用 /NODEFAULTLIB 禁用 CRT(C 运行时),但是没有调用我的构造函数,这最终导致 std::map 错误(访问冲突),因为它没有正确初始化,因为 std::map 构造函数是不叫。

使用 LLVM 8.0.0 编译的代码,以 debug x86 模式编译

class c_test
{
public:

    c_test( int a ) // Constructor not called
    {
        printf( "Test: %i\n", a ); // Doesn't appear and breakpoint is not reached
    }

    void add( const std::string& key, const std::string& val )
    {
        _data[ key ] = val;
    }

private:
    std::map< std::string, std::string >                        _data;
};

c_test test{ 1337 };

int main()
{
    test.add( "qwrqrqr", "23142421" );
    test.add( "awrqw", "12asa1faf" );

    return 1;
}

我已经实现了自己的函数 new(HeapAlloc)、delete(HeapFree)、printf、memcpy、memmove 等,并且都运行良好,我不知道为什么会这样。

标签: c++constructorllvm

解决方案


禁用 CRT 是疯狂的。

这执行关键功能,例如静态初始化。缺乏静态初始化是您的地图处于瘫痪状态的原因。我也完全希望标准库的各个部分停止工作;你真的给自己制造了一个巨大的问题。

不要重新发明关键机器的小部件——重新打开 CRT 并使用专家编写的代码。关闭它确实没有任何相对价值。


推荐阅读