Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2015, 13:06   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос При удалении класса происходит segmentation fault

Здравствуйте.

Есть очень большой класс, который содержит много других классов членов. При удалении класса происходит segmentation fault. Отладчик указывает на самую первую строчку деструктора

Вот эта первая строка
Код:
Map::~Map()
Выделяю память так
Karta = new Map;
Удаляю класс так
delete Karta;

Класс после удаления не использую.
Два дня мучаюсь, не могу решить проблему. Может быть кто-нибудь знает от чего это может быть? Почему выкидывает на первой строчке деструктора?
gunsoy вне форума Ответить с цитированием
Старый 13.08.2015, 13:14   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Есть очень большой класс
Выкиньте его и сделайте несколько не больших.

Цитата:
Отладчик указывает на самую первую строчку деструктора
Ну мало ли что там за отладчик у вас и куда он показывает. Очевидно дело не в этой строке. Как минимум стоит посмотреть содержимое деструктора, а не только на его объявление.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.08.2015, 13:30   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

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

А кто удаляет сам класс? К нему применимы те же потенциальные проблемы.
waleri вне форума Ответить с цитированием
Старый 13.08.2015, 16:35   #4
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Существуют ли какие-нибудь программы которые могут помочь найти проблему? Кроме отладчика я ничем не пользовался. Мне когда-то что-то советовали для решения подобных проблем, только не помню что. У меня Ubuntu.
gunsoy вне форума Ответить с цитированием
Старый 13.08.2015, 17:01   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

valgrind
хотя лучше отладчика еще ничего не придумали.
waleri вне форума Ответить с цитированием
Старый 13.08.2015, 18:23   #6
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Так отладчик лучше чем valgrind? Если так, то с проблемой я буду мучаться очень долго=(
gunsoy вне форума Ответить с цитированием
Старый 13.08.2015, 20:57   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Такие ошибки свидетельствуют о том, что код написан коряво и проблема в архитектуре. Тут уже не отлаживать надо, а переписывать, ибо отловите одну ошибку, а за ней еще десяток всплывёт.
Есть одно простейшее правило: кто создал объект/выделил память, тот за собой и прибирает. В этом случае головняка с памятью будет сильно меньше.
pu4koff вне форума Ответить с цитированием
Старый 13.08.2015, 21:41   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Есть правило еще проще - никогда не работать с памятью напрямую, только через контейнеры или smart указатели.
waleri вне форума Ответить с цитированием
Старый 14.08.2015, 00:13   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Может быть кто-нибудь знает от чего это может быть?
очевидно же, диструктор падает.

в диструкторе содержится код,
который роняет все нафиг.

например: последствия нарушения правила "трех".
(если в качестве данных членов есть сырые указатели,
значит нужен диструктор, конструктор копии, и оператор= )

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Почему выкидывает на первой строчке деструктора?
телепаты в отпуске.
_Bers вне форума Ответить с цитированием
Старый 14.08.2015, 04:44   #10
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Цитата:
Есть правило еще проще - никогда не работать с памятью напрямую, только через контейнеры или smart указатели.
Правильно ли я понял? Если я полностью избавлюсь от операций new/delete и заменю их на std::vector, то проблема исчезнет?
gunsoy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ vector segmentation fault Misa Помощь студентам 4 08.01.2015 19:02
Segmentation fault Hemul Общие вопросы C/C++ 7 16.08.2011 03:23
Vector, Pair и segmentation fault certman Общие вопросы C/C++ 3 25.03.2010 00:24
QT4 segmentation fault jojahti Qt и кроссплатформенное программирование С/С++ 6 06.01.2010 09:57
GCL и segmentation fault. jojahti Свободное общение 0 14.09.2009 19:20