c++ - 将向量转换为向量时的段错误>
问题描述
再会。我想知道我是否可以得到一些帮助。我有以下内容:
#include <vector>
#include <complex>
#include <iostream>
using messageScalar = std::complex<double>;
using messageVector = std::vector<messageScalar>;
using messageMatrix = std::vector<messageVector>;
class Tester {
public:
Tester(messageVector t) {
messageMatrix container(1, t);
messages = &container;
}
Tester(messageMatrix t) {
messages = &t;
}
void debug() {
std::cout << (*messages).size() << std::endl;
for (auto &vector: *messages) { // <- Debugger # 1
for (auto &scalar: vector) { // <- Debugger # 2
std::cout << scalar << std::endl;
}
}
}
private:
messageMatrix *messages = nullptr;
};
int main() {
messageMatrix cMatrix = {{1, 2, 3}, {3, 4, 5}};
Tester first(cMatrix);
first.debug();
}
最后,我对此有一个段错误。它告诉我我有 2 个条目(我期望 - “行”的数量),但我不清楚为什么会发生段错误。
2
18446744072976776191
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
在#1 使用调试器时,我返回一个变量“this”,我尝试打开它并返回
无法访问地址 X 的内存
当我将调试器移到下一行时,它显然比我在 (3) 中为该行输入的条目更多。
我错过了一些明显的东西吗?我也试过做一个
Tester(messageVector t) {
messageMatrix container;
container.emplace_back(t);
messages = &container;
}
但这也不起作用(不是应该的,但我要疯了)
解决方案
问题
问题出在您的构造函数中,请参阅评论:
messageMatrix container(1, t); // <--- container is a local variable
messages = &container; // <--- you take the address of the local variable
} // <--- you leave constructor: local is destroyed
或者对于第二个构造函数:
messages = &t; // <--- t is a parameter
} // <--- you leave constructor, t is destroyed
在这两种情况下,一旦构建结束, messages
指向一个被破坏的对象。取消引用它是UB。任何事情都有可能发生。
一个解法
为了使代码更健壮,最简单的方法是克隆消息矩阵:
class Tester {
public:
Tester(const messageVector &t) : messages(1,t) {
}
Tester(const messageMatrix &t) : messages(t) {
}
void debug() {
std::cout << messages.size() << std::endl;
for (const auto &vector: messages) { // <- Debugger # 1
for (const auto &scalar: vector) { // <- Debugger # 2
std::cout << scalar << std::endl;
}
}
}
private:
messageMatrix messages; // local copy
};
推荐阅读
- c# - 用逗号打印偶数,除了 C# 中的最后一个不工作
- android - 如何在不按返回按钮和关闭按钮的情况下将数据从第二个活动传递到第一个(弹出窗口)?
- gitlab - 发布到组的 gitlab pypi 包注册表
- python - 如何将带有 pip 文件的文件夹配置为本地 pip 存储库
- elixir - 如何更新与 Ecto 的多对多关联
- user-interface - Extjs 布局项目的顺序混乱
- firebase-storage - 在 Flutter Web 上使用 firebase_storage 4.0.0 将图像上传到 Firebase 存储?
- clickhouse - 如何计算每个用户每天的点数,以及从开始到当天在 clickhouse 中的所有点
- python - Python Flask 使用 curl 返回视频文件或 JSON 数据
- python-3.x - 如何在同步函数中调用异步函数?