2009-11-08 5 views
-1

У меня есть высокие требования к памяти в моем коде, и это утверждение повторяется много раз:Ошибка памяти в C++

Node** x; 
x = new Node*[11]; 

Он терпит неудачу в этом распределении. Я понял эту строку, выбросив вывод на консоль!

Я строю свой код на Visual Studio. Он отлично работает в режиме отладки (как в VS2005, так и VS2008) Однако он выдает ошибку в режиме выпуска VS2005. Прямой exe, сгенерированный из cl Program.cpp работает, если cl из VS2010, но не работает, когда он находится на VS2005. Любые подсказки?

PS: Linux дает мне Bus Error (основной сбрасывали) для одних и тех же Благодаря

UPDATE: И я думаю, это может быть связано с «выровненным» вещь, как я понимаю. Я просто сделал 11-12 (или даже четное число), и он работает !!! Я не знаю почему. Он не работает с нечетными номерами!

Обновление 2: http://www.devx.com/tips/Tip/13265?

+1

Почему вы не используете 'std :: vector'? – GManNickG

+2

Ошибка шины - это, как правило, неприглашенный доступ, используете ли вы свой массив с указателем на узел, как если бы это был массив узлов? – falstro

+0

Привет, GMan, спасибо за ответ. Я не могу использовать std :: vector, потому что мне сказали не использовать его :) И я думаю, это может быть из-за «неприсоединения», как я понимаю. Я просто сделал 11-12 (или даже четное число), и он работает !!! Я не знаю почему. Он не работает с нечетными номерами! –

ответ

4

Я думаю, что вы сделали что-то еще, что испортило кучу программ: например, пропустив конец выделенного фрагмента памяти или записав кусок памяти после его освобождения.

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

2

У меня есть высокие требования к памяти в моем коде

Вы на самом деле работает из памяти?

x = new Node*[11]; 

Вы удалите x так:

delete [] x; // the correct way 

или:

delete x; // incorrect 

Или может быть просто что-то еще повреждать кучу, хотя я ожидал бы что работа в режиме режима отладки сделает его более очевидным, не менее. Но с кучевой коррупцией редко бывают гарантии, что он сделает это красиво, легко отлаживается.

+0

Спасибо за указание delete [] x вещь. Но ошибка возникает в точке выделения - я думаю, что я очень уверен в этом. Пожалуйста, см. Мой комментарий выше! Спасибо. –

+3

Если вы используете неправильное удаление, проблема может не возникнуть при удалении, но позже, когда произойдет другое распределение, если предыдущее неправильное удаление исказило структуры данных кучи. –

2

В код нету ничего плохого.

Node **x; 
x = new Node*[11]; 

Вы направляем 11 указателей на класс Node и хранить его как двойной указатель в переменной х. Это отлично.

То, что ваша программа рушится здесь, вероятно, связана с некоторой ошибкой памяти, которая происходит в другом месте вашей программы. Возможно, вы где-то пишете границы массива. Если вы загружаете этот массив с помощью цикла for, дважды проверьте свою индексацию.

Если у вас есть доступ к профилировщику памяти, я бы рекомендовал его использовать.Эти ошибки могут быть трудно отследить в больших программах.

2

Реальная реализация C++ 98 выдает исключение (std :: bad_alloc), если распределение не выполняется, а не просто сбой. Я согласен с предыдущими ответами и предлагаю запустить вашу программу в valgrind, поскольку это воняет коррупции памяти. Valgrind должен быть доступен в вашем дистрибутиве Linux.

 Смежные вопросы

  • Нет связанных вопросов^_^