Ошибка сегментации при вызове «нового» в c ++? - PullRequest
5 голосов
/ 07 сентября 2011

Я получил segfault при попытке вызвать «new», чтобы создать указатель и вставить его в вектор. Код, который я нажимаю на элемент в векторе:

queue->push_back(new Box(gen_id, Interval(x_mid, x_end), Interval(y_mid-y_halfwidth, y_mid+y_halfwidth)));

В основном Box - это класс, а конструктор просто принимает 3 аргумента, generation_id и 2 Intervals. Я распечатал содержимое в векторе до и после этого «толчка», до:

[ -0.30908203125, -0.3087158203125 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.30908203125, -0.3087158203125 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.9510498046875, -0.95068359375 ]

после

[ -0.30908203125, -0.3087158203125 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.951416015625, -0.9510498046875 ]
[ 8.9039208750109844342e-243, 6.7903818933216500424e-173 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.95123291015625, -0.95086669921875 ]

Понятия не имею, почему это происходит, но, очевидно, поврежден один элемент. Между этими двумя наборами вывода нет никаких других кодов, кроме «push», и я использовал gdb для подтверждения этого. Кроме того, я проверил эти 2 Intervals переменные, обе дают мне результат, который имеет смысл.

Мои вопросы: в какой ситуации «новый» получает сегфо? Или моя проблема вызвана другими вещами? Спасибо.

Ответы [ 2 ]

10 голосов
/ 07 сентября 2011

Если предположить, что на самом деле new генерирует ошибку, самой распространенной причиной будет поврежденная куча, обычно в результате перезаписи памяти, которой вы не владеете, и / или двойного удаления.

Valgrind станет вашим другом, если вы сможете работать в системе Linux.

2 голосов
/ 07 сентября 2011

Я сомневаюсь, что new сам дает вам ошибку;проблема, вероятно, в одном из конструкторов.Попробуйте разбить эту гигантскую линию и вставить несколько операторов печати, чтобы точно определить, в чем проблема.

printf("Creating the first interval...\n");
Interval a(x_mid, x_end);
printf("Creating the second interval...\n");
Interval b(y_mid-y_halfwidth, y_mid + y_halfwidth);
printf("Creating the box...\n");
Box* box_to_enqueue = new Box(gen_id, a, b);
printf("Enqueueing the box...\n");
// Do you really want to enqueue a pointer instead of a Box?
queue->push_back(box_to_enqueue);
...