2014-05-11 89 views
0

我试图使用声明如下向量的矩阵:C++矢量分配错误,段故障

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) 
      { 
       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 ! 

        } 
       } 
      }} 
+5

您的第一个也是最大的问题是,当您真的不需要使用指针时。在C++中,很少需要指针。 –

+3

如果不知道“Neurone”是什么样子,很难判断出了什么问题。然而,'新的Neurone [0]'和'new double [0]'看起来很奇怪的事情!你为什么要分配零长度数组?我也衷心地建议你阅读'std :: unique_ptr'和'std :: shared_ptr',而不是在这种情况下使用原始指针。 – Rook

+0

我强烈推荐使用[智能指针](http://en.cppreference.com/w/cpp/memory)代替原始指针,并自己调用'new()'/'delete'来解决你的问题! –

回答

0

std::vector矩阵实际上是std::vector一个std::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你的目的。

0
Neurones[i]->push_back(new Neurone(new Neurone[0], new double[0])); 

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

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

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); 
     }}