【发布时间】:2011-03-26 05:17:11
【问题描述】:
class SimpleVariant
{
public:
SimpleVariant() { /*...*/ };
// ...
};
struct VariantBlock
{
int nRows, nCols;
vector<SimpleVariant> theData;
};
void dumbFunction( VariantBlock& theBlock, int nRows, int nCols )
{
// ...
cout << "theBlock.nRows= " << theBlock.nRows
<< ", theBlock.nCols= " << theBlock.nCols
<< ", theBlock.theData.size() " << theBlock.theData.size();
theBlock.theData.resize( nRows * nCols );
// throws Access Violation Exception
// ...
}
在抛出访问冲突异常之前,输出返回 nRows=61、nCols=5、size()=0,这正是此时应有的值。
我用的是MSVC6,这显然不是最优的,但此时别无选择。
【问题讨论】:
-
这可能是错误的复制行为,正如 James 所指出的,但也可能是程序中其他地方的内存损坏。
-
“程序中其他地方的内存损坏”——让我想到可能是这种情况的一件事是,最初,程序中的其他地方似乎抛出了异常。在放入各种“cout”调试行后,错误似乎移动了。
-
您能否在 VS2008 或 VS2010 Express 中尝试相同的操作来证明是 VC6 导致了问题?众所周知,VC6 STL 实现非常糟糕。见stackoverflow.com/questions/191253 和epsilon-delta.net/articles/vc6_stl.html
-
@Doug:您可以从代码中验证自己,但一种实现的文档表明是的:“如果 sz 大于当前向量大小,则通过在末尾插入尽可能多的副本来扩展内容的 c 以达到 sz 元素的大小。这可能会导致重新分配。"
-
这种bug需要valgrind.org之类的工具
标签: c++ resize access-violation stdvector