问题出现:
在项目包里,需要用到vector容器作为另一个类的初始化参数之一
简化如下:
//存在一个类(这里简写了)
class Box{
public:
Box(int k, vector<double>& num);
vector<vector<double>> Num_box;
};
//构造函数如下:
Box::Box(int k, vector<double>& num){
for (int i = 0; i < num.size(); i++)
{
dataSet[i].push_back(num[i]);
}
colLen = dataSet[0].size();
rowLen = dataSet.size();
}
调用类对象来构造:
vector<double> v;
int a = 3;
Box box(3, &v);
编译通过,运行出现段错误。
后来经过cout大法,定位到错误在:
dataSet[i].push_back()这里。
查找问题:
经过一番苦寻,找到了可能出现的几个问题:1. 考虑到可能是vector非法访问导致的段错误;2. 传入数组的空间过大导致的问题;3. 也是真实存在的问题:类内数组没有初始化!
问题解决:
第一个问题没有考虑,因为访问过程都是在vector内部实现的;
第二个问题,经过调试发现,数组包含60个double类型的数据,因此排除该问题
第三个问题以及解决:
//修改后的构造函数如下:
Box::Box(int k, vector<double>& num){
dataSet.resize(num.size());
for (int i = 0; i < num.size(); i++)
{
dataSet[i].push_back(num[i]);
}
colLen = dataSet[0].size();
rowLen = dataSet.size();
}
使用resize()函数提前预留空间,这样就能很好地解决问题。
新问题:
但是后续在使用的过程中,偶尔还会出现一些问题:
当传入数组为空时,出现段错误。。。所以直接使用if函数,把这种情况剔除即可