дереферирането на току-що вмъкната стойност std::map понякога води до нарушение на достъпа

Label_Info е просто тривиален клас с някои int членове:

class Label_Info {
public:
    Label_Info();
    unsigned int x, x1, x2, y, y1, y2, size;
};

Label_Info::Label_Info() {
    this->x = this->y = this->size = 0;
    this->x1 = this->y1 = -1;
    this->x2 = this->y2 = 0;
}

След това, компилиран с gcc:

std::map<unsigned int, Label_Info> labels_info;
unsigned int label = 1;
Label_Info *label_info = &labels_info[label];

Много рядко ме спира нарушение на достъпа на третия ред. Доколкото разбирам, това, което се случва, е, че std::map вмъква нова Label_Info за ключ 1 и след това указател към това е label_info. Тогава (поне когато не се срине!) мога да получа достъп до членовете по този начин:

label_info->x = 25;

... и така нататък. Не получавам нарушение на достъпа за може би 1 000 000 вмъквания, след което изведнъж бам. Проверих обичайните заподозрени: 32-битов праг и липса на памет и всичко изглежда наред на вложката, когато детонира. Знам, че е вмъкване, защото го виждам да минава през този STL std::map код в програмата за отстраняване на грешки, но не мога да го прочета достатъчно добре, за да разбера какво се опитва да получи за вмъкването.

Така че този код лоша новина ли е? Всяко мнение от хора, които знаят повече за C++ от мен, ще бъде оценено. Благодаря.


person njahnke    schedule 17.05.2012    source източник
comment
Възпроизвеждане на проблема в малка пълна програма. Също така обмислете използването на препратка вместо указател с възможност за повторно поставяне. Най-вероятно проблемът е с повторното поставяне на показалеца, в код, който не е показан тук.   -  person Cheers and hth. - Alf    schedule 17.05.2012
comment
Това в нишкова среда ли е?   -  person walrii    schedule 17.05.2012


Отговори (1)


Кодът, който ни показахте, трябва да е напълно наред. Почти сигурно обаче има друг код, който не ни показвате, който или директно причинява проблема, или по-вероятно просто причинява повреда на паметта при определени обстоятелства и когато удари точно, картите се повреждат.

Ако можете да компилирате кодовата си база на Linux, има голям шанс valgrind да открие грешката в паметта вместо вас.

person Mark B    schedule 17.05.2012
comment
Да, в много редки случаи пишех след края на разпределението на купчина в несвързан код. - person njahnke; 25.05.2012