2014-05-11 113 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); 
     }}