1 c++ stl vector visual-studio-2010
我目前正处于我的解决方案的代码清理过程中,该解决方案由一个静态库和两个依赖它的应用程序组成.作为此代码清理的一部分,我一直在将所有循环转换为std :: vectors以使用迭代器而不是索引.一切进展顺利,直到我转换了一个在构建全局对象(在应用程序中)期间调用的函数(在库中).有问题的函数填充std :: vector,然后在向量中搜索与传递给函数的描述匹配的对象,返回第一个匹配.如果未找到匹配项,则返回向量的前面.
我已设法将问题减少到以下代码:
图书馆 - Bar.h
struct Bar
{
int val;
Bar(int val = 0);
static Bar const& ByVal(int val);
};
Run Code Online (Sandbox Code Playgroud)
图书馆 - Bar.cpp
#include "Bar.h"
#include <vector>
using namespace std;
namespace { vector<Bar> bars; } // It is irrelevant whether bars is in an
// anonymous namespace or not; the results are
// the same.
Bar::Bar(int _val) : val(_val) { }
Bar const& Bar::ByVal(int val)
{
if (bars.empty())
{
bars.push_back(Bar(1));
bars.push_back(Bar(2));
}
#if 1
for (vector<Bar>::const_iterator it = bars.begin();
it != bars.end();
++it) // The assertion fails here. However, when the for loop is
// replaced with a while loop, it's the it != bars.end() part
// that fails.
{
if (it->val == val)
return *it;
}
return bars.front();
#else
for (size_t i = 0;
i < bars.size();
++i)
{
if (bars[i].val == val)
return bars[i];
}
return bars[0];
#endif
}
Run Code Online (Sandbox Code Playgroud)
应用程序 - Foo.cpp
#include <Bar.h>
#include <iostream>
using namespace std;
struct Foo
{
Foo()
{
Bar bar = Bar::ByVal(0);
cout << bar.val << endl;
}
};
Foo foo;
int main(int argc, char** argv)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果Bar.cpp中的条件预处理器更改为0,则代码执行完美.否则,显示以下断言:
Debug Assertion Failed!
Program: C:\Work\Reduction\Debug\Foo.exe
File: c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector
Line: 238
Expression: vector iterators not compatible
Run Code Online (Sandbox Code Playgroud)
这是在Visual Studio 2010中使用全新项目的全新解决方案.项目中唯一更改的设置是使应用程序链接到静态库所必需的设置.
为了弄清楚导致崩溃的原因,我发现代码在以下条件下工作:
任何帮助将不胜感激,即使它意味着回到使用索引或VS2008.我已经疯狂地搜索并且在这个问题上敲了近两天了.
C++标准并不保证bars在之前调用构造函数foo.这有时被称为'静态初始化命令惨败' ; 你可能会很幸运,例如VS2008,但这并不意味着问题消失了.链接的页面提出了一些针对此问题的潜在解决方案,其中之一是使用函数级静态来确保在使用之前对其进行初始化.
| 归档时间: |
|
| 查看次数: |
1416 次 |
| 最近记录: |