2011-02-10 54 views
0

我想从一个使用MetaData类的oracle表中获取列的名称。我从ResultSet中获得了一个MetaData对象的向量,然后循环它们在每个项目上执行getString()函数,问题是在第二次迭代中,当退出循环开始新的迭代时,它崩溃在给我CrtIsValidHeapPointer声明。CrtIsValidHeapPointer问题与Oracle OCCI元数据:: getString

/* 
     * 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; 
     } 

没有任何人有任何建议或有没有人有这个问题,解决它?

OS =视窗,VS2008,甲骨文11.2

回答

1

在该代码并任何直接堆释放,尽管,当然,不std::string分配和释放的堆内存没有。然而,这不应该是除非

  • 堆是由你跨越可执行边界通过std::string一些其它操作或
  • 损坏,导致在一个可执行(例如DLL)分配存储器和另一问题(例如EXE)重新分配它。

你似乎在期待后者:

被指向的数据由pUserData实际上是有效的,所以我怀疑从外部API DLL我的堆是不一样的CRT堆,问题是我该如何解决这个问题?

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

但是,一般来说,让一个可执行文件释放另一个可用资源并不是一个好主意。通常情况下,您应该将资源传回给您从中获得的API,以便在分配资源的位置释放资源。