将向量转换为向量时出现段错误<vector<complex>>
Segfault when converting vector into vector<vector<complex>>
美好的一天。我想知道我是否可以得到一些帮助。我有以下内容:
#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”变量
Cannot access memory at address 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
};
美好的一天。我想知道我是否可以得到一些帮助。我有以下内容:
#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”变量
Cannot access memory at address 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
};