首页 > 解决方案 > 将向量转换为向量时的段错误>

问题描述

再会。我想知道我是否可以得到一些帮助。我有以下内容:

#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;

  }

但这也不起作用(不是应该的,但我要疯了)

标签: c++pointersmatrixvectorsegmentation-fault

解决方案


问题

问题出在您的构造函数中,请参阅评论:

  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 

};

推荐阅读