容易 Core Dump 的情形
容器重新分配内存导致的非法内存访问
1 2 3 4 5 6 7
| struct Biz {...};
std::vector<Biz> bizes; bizes.emplace_back(); auto p_biz = &bizes.back(); bizes.emplace_back();
|
模板
类似需要在编译期展开的代码实现,不能放在 cpp 文件中,而应该放在 header 中
静态变量初始化
1 2 3 4 5 6 7 8
| #ifndef S_H #define S_H class S { static int v; }; int S::v = 0; #endif
|
上面的代码在链接时会报错。声明保护(gragma once 或使用 ifndef 判断)可以解决单个编译单元(单个源文件)的重复声明错误,但不能避免多个编译单元在链接时的重复定义错误。要解决这个问题,需要把静态变量的声明和初始化放在不同的文件里面。
1 2 3 4 5 6 7 8 9 10
| #ifndef S_H #define S_H class S { static int v; }; #endif
int S::v = 0;
|
undefined reference to
编译 C 库使用 C++ 语法
ABI 兼容性问题
1
| "CXXFLAGS": "-D_GLIBCXX_USE_CXX11_ABI=0 -Wno-stringop-truncation"
|
链接的库没有使用统一的 _GLIBCXX_USE_CXX11_ABI
参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "version": 2, "configurePresets": [ { "name": "build", "generator": "Ninja", "binaryDir": "${sourceDir}/build", "cacheVariables": { }, "environment": { "CXXFLAGS": "-D_GLIBCXX_USE_CXX11_ABI=0 -Wno-stringop-truncation" } } ] }
|