【发布时间】:2021-12-30 10:05:43
【问题描述】:
为什么是下面的代码
#include <iostream>
#include <vector>
typedef struct Number {
int number = 15;
} Number;
int main() {
std::vector<Number*> nums(5);
for (size_t i = 0; i < nums.size(); ++i) {
Number num;
nums[i] = #
}
std::cout << nums[1]->number << "\n";
return 0;
}
触发“AddressSanitizer: stack-use-after-scope”,但是当我评论第 15 行时:std::cout << nums[5]->number << "\n"; 它编译得好吗?如何解决?
编译命令:clang++ main.cpp -fsanitize=address,undefined -fno-sanitize-recover=all -std=c++17 -O2 -Wall -Werror -Wsign-compare -g -o debug_solution && ./debug_solution
【问题讨论】:
-
阅读您的 C++ 教科书并了解
new运算符。还有关于std::shared_ptr,当你在它的时候。 -
你正在将
num的地址保存到向量中:num的生命周期是多少? -
不相关:在 C++ 中,您将结构定义为
struct Number { ... }; -
注意:如果您打印出存储在
nums中的地址,则很有可能您会发现它们都是相同的。应该给你一些关于这里出了什么问题的提示。 -
谢谢大家!我正在成为 C++ 领主的路上。
标签: c++ address-sanitizer