Исключение броска карты - PullRequest
1 голос
/ 13 мая 2019

У меня есть карта и процесс для добавления таких данных:

interface CDBColumnInfo
      : public IDBColumnInfo
    {
    public:
        CDBColumnInfo();
        ~CDBColumnInfo();
   private:
    map<int,_bstr_t> m_rowIndexDataMap ;

   HRESULT AddDataToMap(){
    _bstr_t record;
    for (int rownum = 0; rownum < num_rows; ++rownum){
        const int num_cols = PQnfields(res);
        record = "";
        for (int colnum = 0; colnum < num_cols; ++colnum) {
            if (PQgetisnull(res, rownum, colnum) == 0) {
                _bstr_t data = PQgetvalue(res, rownum, colnum);
                record = record + data;
            }
            else {
                record = record + "<NULL>";
            }

            if (colnum + 1 < num_cols) {
                record = record + "#";
            }
        }
        m_rowIndexDataMap[rownum] = record;             
    }

  }

После завершения программы я очищаю карту в деструкторе:

CDBColumnInfo::~CDBColumnInfo() {
 m_rowIndexDataMap.clear();
}

Я получил исключение при завершении деструктора:

File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp
Line: 904

Expression: _CrtIsValidHeapPointer(block)

Я попытался зациклить карту и вручную определить, что исключение произошло в 1-м элементе:

for (auto it = m_rowIndexDataMap.cbegin(); it != m_rowIndexDataMap.cend() ;)
{       

    it = m_rowIndexDataMap.erase(it);    //  exception happened at first element

}
m_rowIndexDataMap.clear();

Что не так с данными на карте?

1 Ответ

1 голос
/ 13 мая 2019

Ошибка, которую вы получили:

File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp Line: 904

Expression: _CrtIsValidHeapPointer(block)

Не обязательно вызвано 'фактическим' кодом или стеком вызовов, но, скорее всего, где-то еще в вашем коде, так как это может быть вызвано обычной проверкой кучи:

Макросы частоты проверки кучи

Вы можете указать, как часто библиотека времени выполнения C выполняет проверку кучи отладки (_CrtCheckMemory) в зависимости от количества обращений к malloc, realloc, free и _msize.

Для получения дополнительной информации см. _CrtSetDbgFlag

...