c++向量分配错误分段错误

Posted

技术标签:

【中文标题】c++向量分配错误分段错误【英文标题】:c++ vector allocation error segmentation fault 【发布时间】:2014-05-11 09:24:16 【问题描述】:

我正在尝试使用这样声明的向量矩阵:

vector<vector<Neurone*>* > Neurones;

顺便说一句,我已经创建了一个类 Neurones。

这是代码:

NeuralNetwork::NeuralNetwork(vector<int> NeuroneNumbers, vector<vector<vector<double>* >* > lw)
    

        for (int i = 0; i < NeuroneNumbers.size(); i++)
        
            if (i == 0)
            
                Neurones.push_back(new vector<Neurone*>());
                for (int j = 0; j < NeuroneNumbers[i]; j++)
                
                    Neurones[i]->push_back(new Neurone(new Neurone[0], new double[0]));
                    if (j == NeuroneNumbers[i] - 1)
                      
                        (*Neurones[i])[j]->Value = 1;//Here is the error ! with i=0 j=0 segmentation fault !

                    
                
            

【问题讨论】:

您的第一个也是最大的问题是,当您确实不需要时使用指针。在 C++ 中很少需要指针。 如果不知道Neurone 的样子,就很难判断出了什么问题。但是,new Neurone[0]new double[0] 看起来很奇怪!你为什么要分配零长度数组?我还衷心建议您阅读std::unique_ptrstd::shared_ptr,而不是在这种情况下使用原始指针。 我强烈建议您使用 smart pointers 而不是原始指针并自己调用 new()/delete 来解决您的问题! 【参考方案1】:

std::vector 的矩阵实际上是std::vectorstd::vector

这是一个例子:

#include <iostream>
#include <vector>

int main() 
  // this is actually a 2D "array"
  std::vector< std::vector<int> > v;
  int N = 5; // rows
  int M = 5; // columns
  v.resize(N); // create N rows
  for(int i = 0 ; i < N ; ++i)
    for(int j = 0 ; j < M ; ++j)
      v[i].push_back(j); // fill the matrix

  //print
  for(int i = 0 ; i < N ; ++i)
    for(int j = 0 ; j < M ; ++j)
      std::cout << v[i][j] << "\n";

  return 0;

[编辑]

我相信,您确实需要使用 pointers 来达到您的目的。

【讨论】:

【参考方案2】:
 Neurones[i]->push_back(new Neurone(new Neurone[0], new double[0]));

你为什么要这样做? new Neurone[0] 是什么意思?如果您打算通过此语句创建一个Neurone,那么实际上您是在将一个Neurone 对象传递给另一个对象的constructor

Neurones[i])[j] 会给你一个指向神经元的指针。所以如果Neuron类有一个名为Valuepublic成员变量,你可以通过

Neurones[i])[j]->Value = 1; // no need the * operator

但是,您不必要地使用了指针,而且使用起来很容易出错。您的代码可以大大简化:

vector<vector<Neurone*> > Neurones;

NeuralNetwork::NeuralNetwork(vector<int> NeuroneNumbers, vector<vector<vector<double>* >* > lw)


    for (int i = 0; i < NeuroneNumbers.size(); i++)
    
        if (i == 0)
        
            vector<Neurone*> neuronVector;
            for (int j = 0; j < NeuroneNumbers[i]; j++)
            
                Neurone neuron=new Neurone(/*constructor params*/); // create a Neuron object
                if (j == NeuroneNumbers[i] - 1)
                  
                    neuron.Value = 1;
                
                neuronVector.push_back(neuron);
            
            Neurones.push_back(neuronVector);
        

【讨论】:

以上是关于c++向量分配错误分段错误的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:在 C++ 中弹出向量时出现 11

在 C++ 中使用向量时出现分段错误

向量分配上的c ++分段错误

带有向量和字符串的 C++ 分段错误

C ++中动态分配的向量中的分段错误

如何修复 C++ 中的“分段错误”错误