Почему я получаю ошибку повреждения кучи? - PullRequest
3 голосов
/ 15 марта 2010

Я новичок в C ++. Я получаю ОШИБКУ КОРРУПЦИИ. Любая помощь будет высоко оценена. Ниже мой код

class CEntity  
{  
//some member variables  
CEntity(string section1,string section2);  
CEntity();  
virtual ~CEntity();  
//pure virtual function ..  
virtual CEntity* create()const = 0;  
};  

Я получаю CLine из CEntity, как показано ниже

class CLine:public CEntity  
{  
// Again some variables ...  
// Constructor and destructor  
CLine(string section1,string section2);  
CLine();  
~CLine();  
CLine* Create() const;  
}  

// CLine Implementation  
CLine::CLine(string section1,string section2) : CEntity(section1,section2){};  
CLine::CLine();  
CLine* CLine::create() const {return new CLine();}  

У меня есть другой класс CReader, который использует объект CLine и заполняет его в мультикарте, как показано ниже

class CReader  
{  
public:  
CReader();  
~CReader();  
multimap<int,CEntity*>m_data_vs_entity;  
};  

//CReader Implementation  
CReader::CReader()  
{  
  m_data_vs_entity.clear();  
};  

CReader::~CReader()  
{  
  multimap<int,CEntity*>::iterator iter;  
  for(iter = m_data_vs_entity.begin();iter!=m_data_vs_entity.end();iter++)  
  {  
    CEntity* current_entity = iter->second;  
    if(current_entity)  
      delete current_entity;  
  }  
  m_data_vs_entity.clear();  
}  

Я читаю данные из файла и затем заполняю класс CLine. Карта заполняется функцией класса CReader. Поскольку в CEntity есть виртуальный деструктор, я надеюсь, что часть кода в деструкторе CReader должна работать. На самом деле, он работает для небольших файлов, но я получаю HEAP CORRUPTION ERROR при работе с большими файлами. Если что-то в корне не так, то, пожалуйста, помогите мне найти это, так как я уже некоторое время ломаю голову.
Заранее спасибо и ожидаю ответа,
С уважением,
Атул

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

CEntity::CEntity(string section1,string section2)
{
    size_t length;
    char buffer[9];
    //Entity Type Number
    length = section1.copy(buffer,8,0);
    buffer[length]='\0';
    m_entity_type = atoi(buffer);

    //Parameter Data Count
    length = section1.copy(buffer,8,8);
    buffer[length]='\0';
    m_param_data_pointer = atoi(buffer);
        //.... like wise ....
}

Я получаю значения с фиксированным интервалом в 8 символов, и я добавляю '\ 0', так что это, я думаю, позаботится о любом значении мусора, с которым я столкнусь.

О Ошибка выделения кучи: после обычного блока (XXX) в XXX CRT обнаружил, что приложение записало в память после завершения буфера кучи. В основном, ошибки выделения кучи происходят где-то еще, чем там, где происходит сбой. Я был бы признателен, если бы кто-нибудь здесь помог мне, как использовать этот нормальный блок и адрес. Спасибо,

Ответы [ 2 ]

1 голос
/ 15 марта 2010

Ну, вы показываете только половину проблемы.

Где находится код, который создает объекты CLine и сохраняет их в CReader?

Кроме того, что, на ваш взгляд, на самом деле «владеет» объектами CEntity? Как правило, вы должны назначить «владельца» ответственным за создание и удаление ...

Я писал ранее:

"Вы могли бы рассмотреть возможность хранения страны непосредственно на карте, вместо хранения указателей. Потенциально менее эффективный, но также гораздо меньше возможностей для курятников. "

Как указывает Нейл, вы не будете хранить КЭНТИТС, так что это предложение не поможет вам ...

0 голосов
/ 18 марта 2010

Наконец, после двух дней отладки я смог исправить сбой. Это из-за того, что я скопировал неверное количество символов из строки.
Извлеченные уроки:
1. Когда вы сталкиваетесь с ошибками выделения памяти, попробуйте сформировать простой тестовый набор, в котором есть минимум объектов для воспроизведения проблемы. 2. Верный способ - это построчная отладка. Я согласен, это проверяет ваше терпение, но нет никаких путей к успеху
3. И это дает вам возможность сделать обзор кода, дополнительно повышая качество кода, который вы будете производить в будущем

Спасибо за вашу помощь и форматирование моего кода:)
С уважением,
Атул

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