在VC6中push_back失败

push_back failing in VC6

本文关键字:back 失败 push VC6      更新时间:2023-10-16

我知道VC6是20世纪的技术,但由于一些特殊原因,我不得不使用它。

我有以下代码,它在VisualStudioExpress2008(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
大小密钥ID-1

然而,如果我用VC6(32位)编译整个东西(包括sqlite3),我会得到以下结果:

KeyID-1
大小密钥ID-0

keyID被定义为

vector<sqlite3_int64> keyIDs;

但我们甚至试着把它改成

vector<int> keyIDs;

我已经没有什么想法了,所以我接受了甚至是疯狂的猜测?

编辑:

我们通过使用局部向量(keyID是类成员)解决了这个问题。不知怎的,我觉得其他地方的一些代码(可能)破坏了向量,使其变得毫无用处。为什么只有VC6才会出现这种情况?这仍然是个谜。

第2版:

虽然我还没有找到根本原因,但我确实发现了另一个问题(在另一个项目中),一个大字符串(2800+个字符)被传递给了一个函数。函数本身接收到类似的东西

function("something"+largestring+"anotherstring")

这导致了其他地方的内存异常(巧合的是,有一个向量)。通过解决

largestring = "something";
largestring += stuff;
largestring += "anotherstring";
function (largestring);

总之,当VC6在堆中创建一个大对象时,似乎出现了问题,这可能会损坏内存。

我希望这能帮助那些像我一样被VC6卡住并发现模糊错误的人。

在visualstudio6中,int是32位。

请尝试使用__int64作为数据类型。

我们通过使用局部向量(keyID是类成员)解决了这个问题。不知怎的,我觉得其他地方的一些代码(可能)破坏了向量,使其变得毫无用处。为什么只有VC6才会出现这种情况?这仍然是个谜。