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

时间:2014-05-11 09:24:16

标签: c++ vector matrix segmentation-fault

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

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 !

                    }
                }
            }}

2 个答案:

答案 0 :(得分:0)

std::vector的矩阵实际上是std::vector的{​​{1}}。

以下是一个例子:

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; } 来达到目的。

答案 1 :(得分: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 public 成员变量,则可以通过

进行设置
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);
        }}