我知道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
大小keyIDs - 1
但是,如果我用VC6(32位)编译整个东西(包括sqlite3),我会得到以下结果:
KeyID - 1
大小keyIDs - 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并且发现模糊不清的错误。
答案 0 :(得分:0)
在visual studio 6中,整数是32位。
尝试使用 __ int64 作为数据类型。
答案 1 :(得分:0)
我们通过使用本地向量解决了这个问题(keyIDs是类成员)。不知何故,我不想跟踪的其他地方的某些代码(可能)会破坏矢量,使其变得无用。为什么这只发生在VC6上?这仍然是一个谜。