VSCode C/C++扩展中全局delete重载不生效该如何排查
全局operator delete重载未生效问题排查方案
首先明确:该问题和VSCode的C++扩展无关,不需要重装扩展,99%的原因是编译器配置或重载签名匹配问题,按以下步骤排查即可:
排查编译器类型
Dev-C默认使用TDM-GCC编译器,而VSCode如果配置的是MSVC(cl.exe)作为编译器,会存在签名匹配差异:C11及更高标准中,存在带size_t参数的全局operator delete重载,MSVC会优先匹配该版本,如果你只实现了无size_t参数的版本,编译器就会调用默认的delete实现。
你可以在代码中补充以下两个重载验证:#include <cstddef> void operator delete(void* m, std::size_t sz) noexcept { std::cout << "User Defined :: Operator delete with size" << std::endl; free(m); } void operator delete[](void* m, std::size_t sz) noexcept { std::cout << "User Defined :: Operator delete[] with size" << std::endl; free(m); }补充后如果自定义delete日志正常输出,即可确认是该问题。
检查编译标准配置
打开VSCode项目下的.vscode/tasks.json文件,查看编译参数中的C++标准设置:如果指定了-std=c++14/-std=c++17/-std=c++20,所有主流编译器都会开启带size_t参数的delete重载匹配,必须补充对应的重载实现才能生效。如果希望兼容旧的重载写法,可以临时将标准降到-std=c++03验证。检查编译优化参数
如果编译参数中开启了-O2/-O3等高等级优化,编译器可能会将你测试代码中没有实际使用的int变量的内存分配释放操作优化掉,导致delete不被调用。可以将优化等级改为-O0(关闭优化)验证。排查链接的第三方库
如果你的链接参数中包含tcmalloc/jemalloc这类自定义内存分配的库,会直接覆盖你写的全局new/delete重载,移除对应链接参数即可。
内容的提问来源于stack exchange,提问作者Greasy 01
相关产品推荐
相关产品推荐

