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

vc2012安装失败因为某些必需的组件失败

在 VC6 编译器中打开包含 Unicode 字符的文件名

调试断言失败(向量下标超出范围)

vc++2012怎么下载安装,求地址方法

win8下安装VC6出现兼容性问题的解决办法