我正在尝试使用MetaData类从oracle表中获取列的名称。我从ResultSet获得一个MetaData对象的向量,然后循环遍历它们,对每个项目执行getString()函数,问题是在第二次迭代中,当退出循环开始新的迭代时,它崩溃了,这给了我CrtIsValidHeapPointer断言。
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));pUserData指向的数据实际上是有效的,所以我怀疑来自外部API DLL的堆与CRT堆不同,问题是我如何解决这个问题?
我的代码:
std::vector<oracle::occi::MetaData> data = res->getColumnListMetaData();
for (std::vector<oracle::occi::MetaData>::iterator iter = data.begin(); iter != data.end(); iter++)
{
//Crash on second iteration after this statement
std::string s = (iter->getString(oracle::occi::MetaData::ATTR_NAME));
int i = iter->getInt(oracle::occi::MetaData::ATTR_DATA_TYPE);
std::cout << i << std::endl;
}有没有人有什么建议,或者有没有人解决了这个问题?
操作系统= Windows、VS2008、Oracle11.2
发布于 2011-02-11 17:50:58
该代码中没有任何直接的堆释放操作,当然,std::string确实会分配和释放堆内存。然而,这应该不是问题,除非
std::string,导致一个可执行文件(例如DLL)分配内存,而另一个可执行文件(例如EXE)释放它。你似乎在期待后者:
pUserData所指向的数据实际上是有效的,所以我怀疑我来自外部API DLL的堆与CRT堆不同,问题是我如何解决这个问题?
事实可能的确如此。如果你对这两个可执行文件都有控制权,你可以让它们都使用相同的动态RTL (“多线程调试DLL”或VC中类似的东西)。
然而,一般来说,让一个可执行文件释放另一个可执行文件的资源并不是一个好主意。通常,您应该将资源传递回您从中获得它们的API,以便可以在分配它的地方释放它。
https://stackoverflow.com/questions/4957677
复制相似问题