2011-02-10 15 views
0

MetaDataクラスを使用してOracle表から列の名前を取得しようとしています。 ResultSetからMetaDataオブジェクトのベクトルを取得し、各項目のgetString()関数を実行してループします。問題は2番目の反復でループを終了して新しい反復を開始するときにクラッシュしますCrtIsValidHeapPointerアサーション。 pUserDataで指されているOracle OCCIでのCrtIsValidHeapPointerの問題MetaData :: 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)); 

データが実際に有効であるので、私は外部の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; 
     } 

誰もが何か提案を持っていますか、誰もがこの問題を持っていたし、それを解決しましたか?もちろん、std::stringはヒープメモリを割り当て、割り当て解除し、ものの

OS = Windowsの、VS2008、オラクルそのコードで11.2

答えて

1

何も、直接的なヒープ割り当て解除を行います。しかし、それは、ヒープが(例えばDLL)メモリと別の割り当てつの実行可能で、その結果、あなたが実行可能な境界を越えstd::stringを渡すいくつかの他の操作または

  • によって破損している

    • ない限り問題にはなりません(EXEなど)の割り当てを解除します。

      pUserDataで指されているデータが実際に有効であるので、私は外部のAPI DLLから私のヒープは、CRTヒープと同じではありません疑う:あなたは後者を期待しているように見える

    問題はどうすればこの問題を解決できますか?

    本当にそうかもしれません。両方の実行可能ファイルを制御できる場合は、それらの両方に同じ動的RTL( "マルチスレッドDLL"またはVCのようなもの)を使用させることができます。

    しかし、一般に、1つの実行可能ファイルに別の実行可能ファイルを解放することは好ましくありません。通常は、取得したAPIにリソースを戻す必要があります。そのため、割り当てられた場所から解放することができます。