VC6中的push_back失败

时间:2012-01-20 23:07:33

标签: c++ vc6

我知道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并且发现模糊不清的错误。

2 个答案:

答案 0 :(得分:0)

在visual studio 6中,整数是32位。

尝试使用 __ int64 作为数据类型。

答案 1 :(得分:0)

我们通过使用本地向量解决了这个问题(keyIDs是类成员)。不知何故,我不想跟踪的其他地方的某些代码(可能)会破坏矢量,使其变得无用。为什么这只发生在VC6上?这仍然是一个谜。