【问题标题】:Segmentation fault when trying to fill a vector as instance variable尝试将向量填充为实例变量时出现分段错误
【发布时间】:2020-11-24 22:02:41
【问题描述】:

我想在我的 .hpp 文件中创建一个填充矩阵作为实例变量,但最终会出现段错误。

我有一个石墨课。 在我的 .cpp 文件中,我填写了一个邻接矩阵,如下所示

void Graphe::shortRoute( void ){
    std::vector<vector<int>> matrix(_adjacences.size(), vector<int>(_adjacences.size()));
    std::vector<vector<int>> shortPath(_adjacences.size(), vector<int>(_adjacences.size()));
    
    for (unsigned i = 0; i < _adjacences.size(); i++) {
                for (auto j : *_adjacences[i]) {
                        matrix[i][j->sommetArrive] = j->longueur;
                }
        } 
... more and more code to get a filled shortPath matrix.

我实现了 Floyd 算法,这里一切正常 我打印了矩阵来检查它,一切都很好。

我想将结果矩阵 matrixshortPath 作为实例变量

我尝试如下 THIS CAUSES SEG FAULT WHY ?

for ( unsigned i = 0; i < _adjacences.size(); i++)
    for (unsigned j = 0; j < _adjacences.size(); j++){
         shortPath[i][j] = SP[i][j];
         matrix[i][j] = M[i][j];
    }

在我的 .hpp 文件中,我声明 SP 和 M 如下:

class Graphe
{
private:
    vector< vector< Arc * > * > _adjacences;
    std::vector<vector<int>> M;
    std::vector<vector<int>> SP;
....

一旦我启动程序,我就会从那个新增功能中得到 seg 错误

圆弧如下:

class Arc
{
public:
    int sommetArrive;
    int longueur;
    string nom;

    Arc( int a_sommetArrive, int a_longueur, string a_nom );
    virtual ~Arc( void );

    friend ostream & operator <<( ostream &, Arc const & );
};

【问题讨论】:

  • 一旦您引入了指针,我们需要了解这些指针在何处、如何以及何时被初始化。
  • 当您几个小时前提出这个问题时,我们要求您提供minimal reproducible example,以便我们可以真正帮助您。即使您删除了原始问题,这仍然适用。干杯
  • 我没有理解最小示例的含义,我无法创建示例,因为我的程序从 XML 文件中读取值并指向它们,这就是为什么 :(
  • 我有 2 个用 int 填充的矩阵,如何将它们作为我的 Graphe 类中的实例变量?这是我的问题
  • @KingAzaiez 不是您要问的,但是此代码 for ( unsigned i = 0; i &lt; _adjacences.size(); i++) for (unsigned j = 0; j &lt; _adjacences.size(); j++){ shortPath[i][j] = SP[i][j]; matrix[i][j] = M[i][j]; } 可以简化为此 shortPath = SP; matrix = M; 您不必编写循环来复制向量,整个向量可以复制到一个单一任务。我怀疑这甚至可以解决你的问题。

标签: c++ matrix vector segmentation-fault adjacency-matrix


【解决方案1】:

不是你要问的,而是这段代码

for ( unsigned i = 0; i < _adjacences.size(); i++) 
    for (unsigned j = 0; j < _adjacences.size(); j++) { 
        shortPath[i][j] = SP[i][j]; 
        matrix[i][j] = M[i][j]; 
    }

可以简化成这样

 shortPath = SP; 
 matrix = M; 

您不必编写循环来复制向量,整个向量可以在一次赋值中复制。

我怀疑这甚至可以解决您的问题。如果是这样,那么最初的问题可能是 shortPathmatrix 向量的大小为零,因此循环代码分配给不存在的向量元素。当您使用单个分配复制向量时,您要复制到的向量的大小会发生变化,以匹配您从中复制的向量的大小。

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多