2011-02-10 48 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,以便在分配資源的位置釋放資源。