Ошибки сегментации в очереди пользовательских указателей

у меня есть deque<rect*> rects где rect пользовательский класс Когда я пытаюсь insert rect* в это я получаю ошибку сегментации. gdb прослеживает проблему обратно к функции под названием __memmove_sse3() из моего призвания rects.insert(it,new rect([constructor parameters])); где it это deque<rect*>::iterator, Что может вызвать эту ошибку?

РЕДАКТИРОВАТЬ:
вот фрагмент моего кода:

for(deque<rect*>::iterator it=rects.begin();it!=rects.end();++it)
{
rect r=*r1;
rect r2=*(*it);
if(!r2.there)
continue;
if(r.down>r2.up || r.up<r2.down || r.right<r2.left || r.left>r2.right)
continue;
if(r.left>r2.left)
rects.insert(it,new rect(r2.left,r2.down,r.left,r2.up,r2.color));
if(r.right<r2.right)
rects.insert(it,new rect(r.right,r2.down,r2.right,r2.up,r2.color));
if(r.up<r2.up)
rects.insert(it,new rect(max(r.left,r2.left),r.up,min(r.right,r2.right),r2.up,r2.color));
if(r.down>r2.down)
rects.insert(it,new rect(max(r.left,r2.left),r2.down,min(r.right,r2.right),r.down,r2.color));
r2.there=false;
}

0

Решение

Проблема в том, что вы вставляете элемент в std::deque который делает недействительным итератор, который вы увеличиваете в for цикл:

Стандарт (проект № 3448) гласит в §23.3.3.4 / 1 (выделите мой),

Последствия: Вставка в середине deque делает недействительными все итераторы и ссылки на элементы deque. Вставка в любом конце deque делает недействительными все итераторы в deque, но никак не влияет на достоверность ссылок на элементы deque.

2

Другие решения

Сегфаулты могут поступать из любого количества источников и не всегда проявляются сразу. Скорее всего, вы переполняете массив, используете контейнеры stl недопустимым образом и т. П. — когда вы повреждаете области памяти, которые вам не принадлежат, которые могут быть использованы, например, для. учет распределения, он может сделать будущие распределения, освобождения, перемещения или любые другие косвенные доступы неэффективными.

Вывод больших пушек может помочь решить это быстро! Ты можешь использовать Valgrindмодуль memcheck, если вы работаете в системе, в которой будет работать valgrind, или вы можете использовать что-то вроде Проверка приложения на винде.

Ваш компилятор или библиотеки могут иметь стандартную функцию отладки библиотеки / STL — если вы находитесь в IDE, поэкспериментируйте, чтобы узнать, какие опции у вас есть. Для libstdc ++ (часто используется с gcc / g ++), вы можете посмотреть на Параметры поддержки отладки в libstdc ++.

Вот мой ранее ответ на вопрос о куче коррупции который обсуждает такие инструменты, и мой список причин, по которым вы можете захотеть перегрузить оператор new и удалить также есть еще один список инструментов. (Самоуверенное самореклама здесь, но я думаю, что это довольно хорошие списки!)


На основании вашего кода я бы сказал, что вы лишаете законной силы итератор цикла. От http://www.sgi.com/tech/stl/Deque.html:

Семантика аннулирования итератора для deque заключается в следующем. Вставить
(включая push_front и push_back) делает недействительными все итераторы, которые
обратитесь к deque. Стереть в середине deque делает недействительным все
итераторы, которые ссылаются на deque. Стереть в начале или в конце
deque (включая pop_front и pop_back) делает недействительным только итератор
если он указывает на стертый элемент.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector