Проблема CrtIsValidHeapPointer с метаданными Oracle OCCI :: getString - PullRequest
0 голосов
/ 10 февраля 2011

Я пытаюсь получить имя столбца из таблицы оракула, используя класс MetaData.Я получаю вектор объектов MetaData из ResultSet, а затем зацикливаюсь на них, выполняя функцию getString () для каждого элемента, проблема в том, что на второй итерации, при выходе из цикла, чтобы начать новую итерацию, происходит сбойCrtIsValidHeapPointer Assertion.

  /*
         * 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, действительно действительны, поэтому я подозреваю, что моя куча из DLL внешнего API не совпадает с кучей 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 = Windows, VS2008, Oracle 11.2

1 Ответ

1 голос
/ 11 февраля 2011

Ничего в этом коде не делает прямого освобождения кучи, хотя, конечно, std::string выделяет и освобождает память кучи.Тем не менее, это не должно быть проблемой, если

  • куча не повреждена какой-либо другой операцией или
  • , когда вы пропустите std::string через границы исполняемого файла, что приведет к одному исполняемому файлу (например,DLL) выделение памяти и другой (например, EXE) освобождение it.

Похоже, вы ожидаете последнего:

Данные, на которые указывает pUserData, действительно действительны, поэтому я подозреваю, что моя куча из DLL внешнего API неКак и в куче CRT, вопрос в том, как мне решить эту проблему?

Это действительно может быть так.Если у вас есть контроль над обоими исполняемыми файлами, вы можете заставить их использовать один и тот же динамический RTL («Многопоточная отладочная DLL» или что-то подобное в VC).

Тем не менее, в общем случае не рекомендуется иметь один исполняемый файл, освобождающий ресурсы другого.Обычно вы должны передавать ресурсы обратно в API, из которого вы их получили, чтобы его можно было освободить там, где он был выделен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...