C++ 未使用/NODEFAULTLIB调用构造函数
我使用/NODEFAULTLIB来禁用CRT(C运行时),但是没有调用我的构造函数,这最终导致std::map(访问冲突)中出现错误,因为它没有正确初始化,因为没有调用std::map构造函数 使用LLVM 8.0.0编译的代码,在调试x86模式下编译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
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无关问题。