【发布时间】:2021-04-09 05:34:48
【问题描述】:
美好的一天。我想知道我是否可以得到一些帮助。我有以下内容:
#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;
}
但这也不起作用(不是应该,但我要疯了)
【问题讨论】:
-
messages指向一个在构造函数作用域结束时被销毁的局部变量。 -
您尝试过的所有内容都不是有效的 C++。当构造函数/方法/函数返回时,在任何构造函数、类方法或函数中本地声明的对象都会被销毁。保存指向它的指针,push_back-ing 指向它的指针,这些都没有任何区别。 C++ 不能以这种方式工作。 A good C++ textbook 应该会给你一个更完整的解释和教程,说明 C++ 中自动和动态范围对象之间的区别。
-
是否有快速修复或我需要重组所有内容?
-
C++ 中很少有问题可以“快速修复”。您需要正确理解对象生命周期在 C++ 中是如何工作的。此外,只有您确切知道何时需要创建程序中的对象、它们的所有者以及它们何时被销毁。没有一个所有 C++ 程序都必须遵循的通用规则。这完全取决于每个 C++ 程序的独特要求和功能。您需要为您的 C++ 程序中的所有对象正确定义对象生命周期,并相应地实现它们。
标签: c++ pointers matrix vector segmentation-fault