Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将矢量转换为矢量时出现SEGFULT<;向量<;综合体>&燃气轮机;_C++_Pointers_Matrix_Vector_Segmentation Fault - Fatal编程技术网

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 

};