在VC6中push_back失败
push_back failing in VC6
我知道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才会出现这种情况?这仍然是个谜。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- variadic模板中的模板参数推导失败