C++ 将矢量转换为矢量时出现SEGFULT<;向量<;综合体>&燃气轮机;
你好。我想知道我是否能在这方面得到一些帮助。我有以下几点:C++ 将矢量转换为矢量时出现SEGFULT<;向量<;综合体>&燃气轮机;,c++,pointers,matrix,vector,segmentation-fault,C++,Pointers,Matrix,Vector,Segmentation Fault,你好。我想知道我是否能在这方面得到一些帮助。我有以下几点: #include <vector> #include <complex> #include <iostream> using messageScalar = std::complex<double>; using messageVector = std::vector<messageScalar>; using messageMatrix = std::vector<m
#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();
}
在#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
<代码>消息< /C++ >指向一个本地变量,该变量在构造函数的作用域结束时被破坏。当构造函数/方法/函数返回时,在任何构造函数、类方法或函数中本地声明的对象将被销毁。保存指向它的指针,推回指向它的指针,这些都没有任何区别。C++不这样工作。应该给C++一个更完整的解释和教程,说明C++中自动和动态范围的对象之间的区别。有没有快速修复或者我需要重构所有的东西?C++中很少有问题有“快速修复”。您需要正确理解对象生命周期如何在C++中工作。此外,只有您确切地知道程序中的对象何时需要创建,它们的所有者是谁,以及它们何时被销毁。所有C++程序都必须遵循这一规则。这取决于每个C++程序的独特需求和功能。你需要正确地定义C++程序中所有对象的对象生命周期,并相应地执行它们。不过,我试图将消息作为指针保存(以检查nullptr)。可能吗?我还需要尝试一下,看看这个方法是否适用于messageScalar类型well@IanQuah可以保留指针,但必须确保1)使用原始对象的地址;2) 测试仪存在期间,原始对象存在且未移动;3) 当不再需要原始对象时,但在销毁测试仪之前,原始对象将被销毁。messageVector的情况使得这个问题变得棘手,因为您需要构造一个临时矩阵。为此,您可以使用共享的_ptr,但您将不再使用原始向量(即,如果它发生变化,临时矩阵将不会更新)。对不起,您能否详细说明我将如何使用共享的_ptr?你所说的一切(原件地址、原件未移动、原件未销毁)对我都有意义。话虽如此,但我不清楚共享的ptr如何以及为什么会有帮助?此外,如果对原始版本的更改没有反映在temporary@IanQuah有关使用共享指针的信息,请参见和。请参阅关于为什么共享指针比原始指针更可取的一些提示。如果可以不遵循对原始版本的更改,则非指针版本更安全。从性能的角度来看,您的版本无论如何都会复制1到2份原始数据。拟议的替代方案只产生了一个。
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
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
};