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_ptr
和std::shared_ptr
,而不是在这种情况下使用原始指针。
我强烈建议您使用 smart pointers 而不是原始指针并自己调用 new()
/delete
来解决您的问题!
【参考方案1】:
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
来达到您的目的。
【讨论】:
【参考方案2】: Neurones[i]->push_back(new Neurone(new Neurone[0], new double[0]));
你为什么要这样做? new Neurone[0]
是什么意思?如果您打算通过此语句创建一个Neurone
,那么实际上您是在将一个Neurone
对象传递给另一个对象的constructor
。
Neurones[i])[j]
会给你一个指向神经元的指针。所以如果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);
【讨论】:
以上是关于c++向量分配错误分段错误的主要内容,如果未能解决你的问题,请参考以下文章