【问题标题】:c++ vector allocation error segmentation faultc++向量分配错误分段错误
【发布时间】: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 来解决您的问题!

标签: c++ vector matrix segmentation-fault


【解决方案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);
            }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多