Сег ошибки после успешного вызова деструктора или вызова empy destructor. C ++ - PullRequest
0 голосов
/ 20 марта 2011

Мне очень жаль, что я не могу предоставить более подробную информацию о моем коде, так как я беру на себя другой проект. Структура классов очень сложна, и я не могу воспроизвести проблему, используя простой пример.

По сути, если я удаляю объект, все операторы в деструкторе были выполнены успешно, но как только деструктор заканчивает выполнение, возникает ошибка сегмента. Даже если я просто сделаю деструктор пустым и ничего не сделаю, ошибка сегмента все равно случится. Этот класс не имеет базового класса.

Мой код выглядит так:

ParallelSynthesizer* p = new ParallelSynthesizer(argc, argv);
p->synthesize();
delete p;
cout << "after deleting" << endl; 

«после удаления» не показывалось, так как до этого произошла ошибка сегмента. Но деструктор p выполнен успешно.

[РЕДАКТИРОВАНО ПОСЛЕ НЕКОТОРЫХ КОММЕНТАРИЙ] метод synthesize () использует многопоточность, но он очень прост:

pthread_t threads[num_threads];
// makes the "params" array here. skipped. 
for (int i=0; i<num_threads; i++) {
    pthread_create(&threads[i], NULL, synthesizeThreadMethod, (void*)(params[i]));
}

for (int i=0; i<num_threads; i++) {
    pthread_join(threads[i], NULL);;
}

Это почти все в методе synthesize (), поэтому я не думаю, что многопоточность приведет к каким-либо проблемам.

Я использую g ++ в Linux. Кто-нибудь знает возможные причины этой проблемы?

Я снова прошу прощения за то, что не смог найти простой пример, который вызывает эту ошибку.

Ответы [ 3 ]

1 голос
/ 20 марта 2011

Одной из возможных причин является то, что другой объект пытается получить доступ к p после того, как он был удален.

Обновление Вы можете попробовать запустить свой код через valgrind. Немного зависит от того, насколько хорошо вы можете изолировать проблему заранее. До сих пор я предполагаю, что вы делаете что-то плохое внутри своего класса (например, создаете объект и передаете p в качестве параметра).

0 голосов
/ 20 марта 2011

Я думаю, что сбой происходит во время operator delete(void*), которое вызывается delete p; сразу после деструктора.

Существует множество возможных причин испортить кучу таким образом, что это может привести к сбою. Распространенным может быть то, что некоторый код ранее записывался в память до или после объекта new. Я бы запустил программу под valgrind memcheck; Это очень полезный инструмент, специально предназначенный для отслеживания ошибок такого рода.

0 голосов
/ 20 марта 2011

Трудно сказать, основываясь на том, что вы сказали, но похоже, что у вас есть куча повреждений.

Этот тип проблемы сложно отследить, и читателям Stack Overflow практически невозможноисправить это для вас, учитывая большую базу кода.Я бы порекомендовал запустить такой инструмент, как valgrind , который будет отслеживать обращения к памяти и подсказывать, где что-то пошло не так.

...