Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未使用/NODEFAULTLIB调用构造函数_C++_Constructor_Llvm - Fatal编程技术网

C++ 未使用/NODEFAULTLIB调用构造函数

C++ 未使用/NODEFAULTLIB调用构造函数,c++,constructor,llvm,C++,Constructor,Llvm,我使用/NODEFAULTLIB来禁用CRT(C运行时),但是没有调用我的构造函数,这最终导致std::map(访问冲突)中出现错误,因为它没有正确初始化,因为没有调用std::map构造函数 使用LLVM 8.0.0编译的代码,在调试x86模式下编译 class c_test { public: c_test( int a ) // Constructor not called { printf( "Test: %i\n", a ); // Doesn't a

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

使用LLVM 8.0.0编译的代码,在调试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;
}
c_类测试
{
公众:
c_test(int a)//未调用构造函数
{
printf(“测试:%i\n”,a);//未出现且未达到断点
}
void add(常量std::string和key,常量std::string和val)
{
_数据[键]=val;
}
私人:
std::map\u数据;
};
c_检验{1337};
int main()
{
添加测试(“qwrqrqr”、“23142421”);
测试。添加(“awrqw”、“12asa1faf”);
返回1;
}

我已经实现了我自己的函数new(HeapAlloc)、delete(HeapFree)、printf、memcpy、memmove等,所有这些都工作得很好,我不知道为什么会发生这种情况。

禁用CRT是疯狂的

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


不要重新发明一些关键的机器——重新打开阴极射线管,使用专家们编写的代码。关闭它真的没有什么相对价值。

我发现了问题并解决了,另一个论坛的一个家伙说我需要手动调用存储在.CRT部分指针中的构造函数,我只是这样做了,它工作得很好


我刚刚调用了调用我的构造函数的_GLOBAL\u sub\u I_main\u cpp函数,解决了我的所有问题,谢谢你的回答。

你不能在
/NODEFAULTLIB
中使用大多数库的内容,也不能依赖于动态初始化阶段。我不能在/NODEFAULTLIB中使用一些函数,我绝对肯定构造函数没有被调用,因为我的断点没有被调用,printf不是STL可能依赖CRT的问题。你为什么要禁用它呢?通过禁用它,实际上没有什么可以获得,并且你会创造很多难以检测的问题。虽然C++甚至不尝试遵循“不为你不使用的东西付费”的概念,但是我怀疑你可以通过避免链接CRT来节省大量的字节。而且,即使您保存了一些,也可能会发现,和资源相比,可执行文件的代码大小微不足道,所以所有避免运行时的操作都可能是浪费时间。关于“阻碍逆向工程”的部分毫无意义……如果你重新实现CRT中所有缺失的东西,那么你的可执行文件的大小很可能会显著增加,甚至可能超过普通CRT的可执行文件的大小。许多函数在没有CRT的情况下都能完美工作(显然,我需要重新创建stl使用的一些函数,如new、delete等),我知道有些人在没有CRT的情况下使用std::map/std::unordered_map,而且没有任何问题,我可以在我的项目中使用std::vector/std::deque/std::list,没有任何问题。在我的情况下,禁用CRT是值得的,你对如何解决我的问题有什么想法吗?@cYeR我怀疑这些容器中的任何一个在没有CRT的情况下都可以正常工作(除其他事项外)依赖于工作异常处理。这是我的建议。当然欢迎您忽略它,但仅仅断言“不值得”不会改变我的答案,即它不值得:)@VTT您可以在不使用CRT的情况下使用这些容器,只需创建这些容器所需的函数并禁用异常,我可以保证它可以正常工作perfectly@cYeR您可能需要禁用它,但也需要保持启用状态,因为您正在使用需要它的代码。其他人使用过一些代码与您的pr无关问题。