我知道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 ; };
}

在这个特定的测试用例中,只有一条记录,因此,正如您可能期望的那样,输出是



但是,如果我用VC6(32位)编译全部内容(包括sqlite3),则将得到以下结果:



keyID定义为
vector<sqlite3_int64> keyIDs;

但我们甚至尝试将其更改为
vector<int> keyIDs;

我对什么可能是错误的想法不多了,所以我什至接受疯狂的猜测?

编辑:

我们通过使用局部 vector (keyID是类成员)解决了这个问题。不知何故,我不觉得要跟踪的其他代码段(可能)破坏了 vector ,使其变得无用。为什么只有VC6会发生这种情况?这将仍然是一个谜。

编辑2:

尽管我还没有找到根本原因,但是我确实发现了另一个问题(在另一个问题中),该问题是将大字符串(2800多个字符)传递给函数的。该函数本身收到类似
function("something"+largestring+"anotherstring")

并在其他地方(恰巧与 vector )引起了内存异常。解决了
largestring = "something";
largestring += stuff;
largestring += "anotherstring";

function (largestring);

结论是,当VC6在堆中创建一个大对象时,似乎有些错误,这可能会损坏内存。

我希望这对像我一样坚持使用VC6并且发现模糊错误的人有所帮助。

最佳答案

在Visual Studio 6中,整数是32位。

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

关于c++ - VC6中的push_back失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8949006/

10-09 16:27