【发布时间】:2022-01-20 11:30:10
【问题描述】:
我有一个 std::string 似乎以某种方式损坏。有时字符串析构函数会触发访问冲突,有时通过 std::cout 打印会导致崩溃。
如果我如下填充结构中的字符串,则 back_padding 在我的代码中相对一致的点处会稍微损坏:
struct Test {
int front_padding[128] = {0};
std::string my_string;
int back_padding[128] = {0};
};
有没有办法保护前后填充数组,以便写入它们会导致异常或什么?或者也许有一些工具可以用来捕捉写入该内存的罪魁祸首?
平台:使用 MSVC 构建的 Windows x64。
【问题讨论】:
-
您需要的工具是边界检查器。如果您使用的是 C++ 标准库容器,则可以打开检查迭代器。
-
asan/valgrind 可能有帮助吗?
-
如果你使用调试器,你可以在填充上抛出一个观察点。您的代码中可能存在与字符串不直接相关的 UB。
-
自 2019 v16.9 起,MSVC 应该有一个地址清理程序——它会自动完成你的要求。文档here.