【发布时间】:2010-05-26 09:36:57
【问题描述】:
我有一个方法如下(来自一个实现 TBB 任务接口的类 - 虽然目前不是多线程) 我的问题是访问向量的两种方式导致了完全不同的行为——一种有效,另一种导致整个程序非常壮观地爆炸(这是一个插件,通常主机会捕获崩溃——但这种需要主持人节目也出来了!正如我所说的非常壮观)
void PtBranchAndBoundIterationOriginRunner::runOrigin(int origin, int time) const // NOTE: const method
{
BOOST_FOREACH(int accessMode, m_props->GetAccessModes())
{
// get a const reference to appropriate vector from member variable
// map<int, vector<double>> m_rowTotalsByAccessMode;
const vector<double>& rowTotalsForAccessMode = m_rowTotalsByAccessMode.find(accessMode)->second;
if (origin != 129) continue; // Additional debug constrain: I know that the vector only has one non-zero element at index 129
m_job->Write("size: " + ToString(rowTotalsForAccessMode.size()));
try {
// check for early return... i.e. nothing to do for this origin
if (!rowTotalsForAccessMode[origin]) continue; // <- this works
if (!rowTotalsForAccessMode.at(origin)) continue; // <- this crashes
} catch (...) {
m_job->Write("Caught an exception"); // but its not an exception
}
// do some other stuff
}
}
我讨厌不提出明确定义的问题,但目前我最好的措辞是:“WTF?”
我正在使用 Microsoft (R) Visual Studio 版本 9.0.21022.8 使用 Intel C++ 11.0.074 [IA-32] 进行编译,并且我的向量实现具有
const_reference operator[](size_type _Pos) const
{ // subscript nonmutable sequence
#if _HAS_ITERATOR_DEBUGGING
if (size() <= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
return (*(_Myfirst + _Pos));
}
(迭代器调试已关闭 - 我很确定)和
const_reference at(size_type _Pos) const
{ // subscript nonmutable sequence with checking
if (size() <= _Pos)
_Xran();
return (*(begin() + _Pos));
}
所以我能看到的唯一区别是 at 调用开始而不是简单地使用 _Myfirst - 但这怎么可能导致行为如此巨大的差异?
更新:
索引在范围内 - 大小打印为 377,索引限制为 129。
成员变量有对应accessMode的入口
为了澄清@nikko 的建议,整件事都包含在以下内容中:
map<int, vector<double>>::const_iterator it = m_rowTotalsByAccessMode.find(accessMode);
if (it != m_rowTotalsByAccessMode.end())
{
...
更新 我已将我的编译器升级到最新版本 11.1.065,并且不再发生这种情况。好像哪里有点奇怪。
【问题讨论】:
-
对于更新: "index is constrained to 129" ,你不是在检查
>=而是在做!=。这是故意的吗? -
如果你看一下代码中的注释,它看起来就像是故意的。
-
我看到了评论,但更新中的声明让我有点困惑。
-
如果你在一个简单的测试程序中这样做会发生什么?也许你有一些内存损坏,或者插件编译有问题。您是否处理插件和主程序之间共享的对象?
-
@nikko,我还没有尝试在测试程序中隔离它。我认为内存损坏是最可能的答案,但我不知道从哪里开始 - 通常如果是内存,你可以修复症状(在与 [] 时),然后问题会在其他地方弹出 - 但在这种情况下我不能让它崩溃,除了这条线 - 我什至打开了多线程并用 8 个线程运行 - 坚如磐石:(