将向量转换为向量时出现段错误<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 

};