push_back 在 VC6 中失败
Posted
技术标签:
【中文标题】push_back 在 VC6 中失败【英文标题】:push_back failing in VC6 【发布时间】:2012-01-20 23:07:33 【问题描述】:我知道 VC6 是 20 世纪的技术,但出于某些特殊原因,我不得不使用该编译器。
我有以下代码,在 Visual Studio Express 2008(32 位)中运行良好
while( sqlite3_step( stmt ) == SQLITE_ROW )
int tmp;
tmp = sqlite3_column_int64( stmt, 0 );
if(DEBUG) cout << "KeyID - " << tmp << endl ; ;
keyIDs.push_back(tmp);
if(DEBUG) cout << "Size keyIDs - " << keyIDs.size() << endl ; ;
在这个特定的测试用例中,只有一条记录,所以输出,如您所料,是
KeyID - 1 大小 keyID - 1
但是,如果我用 VC6(32 位)编译整个东西(包括 sqlite3),我会得到以下结果:
KeyID - 1 大小 keyID - 0
keyIDs 定义为
vector<sqlite3_int64> keyIDs;
但我们甚至尝试将其更改为
vector<int> keyIDs;
我想不出什么是错误的,所以我接受即使是疯狂的猜测?
编辑:
我们通过使用局部向量(keyIDs 是类成员)解决了这个问题。不知何故,我不觉得跟踪的其他地方的一些代码(可能)破坏了向量,使其无用。为什么这只发生在 VC6 上?这将是一个谜。
EDIT2:
虽然我还没有找到根本原因,但我确实发现了另一个问题(在不同的项目中),将一个大字符串(2800 多个字符)传递给了一个函数。函数本身收到类似
function("something"+largestring+"anotherstring")
这导致了其他地方的内存异常(巧合的是,带有向量)。解决了
largestring = "something";
largestring += stuff;
largestring += "anotherstring";
function (largestring);
总之,VC6 在堆中创建大对象时似乎有问题,这可能会损坏内存。
我希望这可以帮助像我一样被 VC6 卡住并发现难以理解的错误的人。
【问题讨论】:
VC++ 6 中包含的vector
的实现很可能被破坏了。如果我记得,它对模板的支持并不是那么好......
真的,不管你为谁工作,求他们让你在 2008 年或 2010 年得到你...求他们跪下。当然,如果它是一个只支持 VC6 的工具链.. 你有点搞砸了,我表示最深切的哀悼。
我用VC++ 6很久了,vector没问题。只是为了笑,尝试将大小分配给一个 int 然后打印它。我知道 iostream 存在一些问题,但不记得具体细节,因为我们从未使用过它们。
你能用调试器逐步跟踪它吗?
@Xeo 在我的膝盖上乞讨不是一种选择......它就像一个已经存在的工具的插件。但是谢谢...我笑得很开心
【参考方案1】:
在 Visual Studio 6 中,整数是 32 位。
尝试使用 __int64 作为数据类型。
【讨论】:
还要确保您已应用 SP6。有许多修复。【参考方案2】:我们通过使用局部向量(keyIDs 是类成员)解决了这个问题。不知何故,我不觉得跟踪的其他地方的一些代码(可能)破坏了向量,使其无用。为什么这只发生在 VC6 上?这将是一个谜。
【讨论】:
如果您的成员变量被破坏,这可能只是冰山一角。我希望你为下一个神秘的错误做好准备。 我知道你的意思。是的...一旦我最终解决了这些问题,我就会深入挖掘。不过谢谢提醒以上是关于push_back 在 VC6 中失败的主要内容,如果未能解决你的问题,请参考以下文章
flash loader demo下载程序,最后一步失败,(stm32,vc6t)提示:fail:unable to download data