首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle OCCI元数据的CrtIsValidHeapPointer问题::getString

Oracle OCCI元数据的CrtIsValidHeapPointer问题::getString
EN

Stack Overflow用户
提问于 2011-02-10 21:31:49
回答 1查看 1.5K关注 0票数 0

我正在尝试使用MetaData类从oracle表中获取列的名称。我从ResultSet获得一个MetaData对象的向量,然后循环遍历它们,对每个项目执行getString()函数,问题是在第二次迭代中,当退出循环开始新的迭代时,它崩溃了,这给了我CrtIsValidHeapPointer断言。

代码语言:javascript
复制
  /*
         * 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堆不同,问题是我如何解决这个问题?

我的代码:

代码语言:javascript
复制
 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-11 17:50:58

该代码中没有任何直接的堆释放操作,当然,std::string确实会分配和释放堆内存。然而,这应该不是问题,除非

  • 堆被某些其他操作或
  • 破坏,您跨可执行文件边界传递std::string,导致一个可执行文件(例如DLL)分配内存,而另一个可执行文件(例如EXE)释放它。

你似乎在期待后者:

pUserData所指向的数据实际上是有效的,所以我怀疑我来自外部API DLL的堆与CRT堆不同,问题是我如何解决这个问题?

事实可能的确如此。如果你对这两个可执行文件都有控制权,你可以让它们都使用相同的动态RTL (“多线程调试DLL”或VC中类似的东西)。

然而,一般来说,让一个可执行文件释放另一个可执行文件的资源并不是一个好主意。通常,您应该将资源传递回您从中获得它们的API,以便可以在分配它的地方释放它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4957677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档