【发布时间】:2013-08-27 00:10:58
【问题描述】:
我在返回一个我没有预料到的空向量时遇到了一些问题。有人可以帮忙解释一下吗!
这是有问题的部分: - 我知道返回是相同的,它现在是一个占位符。
std::vector<std::vector<double> > PerceptronLayer::calculateLayer() {
std::vector<std::vector<double> > result;
if (vPerceptrons.size() == 0) {
return result;
}
return result;
}
但是,如果我通过设置一些虚拟数据来确保向量具有某些值,则该函数会按我的预期返回。
std::vector<double> val;
val.push_back(1.0);
result.push_back(val);
GDB 输出:
Program received signal SIGSEGV, Segmentation fault.
0x000000000040ba60 in std::vector<double, std::allocator<double> >::operator[] (this=0x0, __n=0)
at /usr/include/c++/4.7/bits/stl_vector.h:751
751 { return *(this->_M_impl._M_start + __n); }
我可以通过不允许它在空数据上运行来保护该函数,但我不禁觉得我在这里缺少一些基本的东西。
谢谢, 乔
【问题讨论】:
-
你能告诉我们完整的代码吗?很难说您发布的代码有什么问题。
-
使用 GDB 命令
up遍历调用堆栈。看起来您的代码中的某处返回值被假定为非空。 -
啊,好的。是的,我想我找到了。我的回报是: std::vector<:vector> > results = pl.calculateLayer();如果我把它分成两行它可以工作: std::vector<:vector> > results;结果 = pl.calculateLayer();
-
@joeButler 这个结果看起来很有趣。单行使用复制构造函数,而双行使用赋值运算符重载。为什么会发生这种情况?我在 Visual Studio 上试过这个,但一切都很好。 gcc/g++ 对此有不同的实现吗?
-
错误出现在您没有向我们展示的代码中。您在从未检查过内容的向量上的至少一个位置使用了未经检查的
std::vector<>::operator[]()数组运算符(即您在尝试访问v[N]之前没有v.size() > N)。
标签: c++ vector stl segmentation-fault