2012-03-24 3 views
0

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

Это то, что он в принципе делает.

У меня есть компонент gui под названием Table. Мне нужно 1000 таблиц. Не больше, не меньше. Таблица наследует от Widget и DynamicElement одновременно. Мне нужно иметь возможность передавать адрес компонента (указатель, а не копию), поэтому мне нужно, чтобы они не перемещались.

Первая попытка, с которой я работал. Я использовал вектор таблицы *, и каждая из таблиц была отдельно выделена в куче. Этот метод немного медленный и рискует фрагментировать кучу ни для чего, потому что мне нужно ровно 1000.

Следующее решение, которое я разработал для родительского класса, имеет таблицу m_tables [1000].

Я не вижу причин, почему это не должно работать, но когда я делаю это так, он падает. На самом деле, в любое время, кажется, я пытаюсь сделать что-то с участием & m_tables [x] что-то пошло не так.

Он падает с ошибкой 0xccccccccc когда-либо пытается получить доступ к указателю, полученному путем выполнения & m_tables [i].

Есть ли что-то, что я не понимаю?

Вот как я создаю таблицу:

void LobbyTableManager::createTable(int tableId) 
    { 
     m_tables[tableId] = LobbyTable(m_fontMan,m_spriteMan,tableId); 
     LobbyTable* t = &m_tables[tableId]; 
     t->addChairActionListeners(this); 
     t->addMouseListener(this); 
     t->addChairMouseListeners(this); 
     t->getTable()->addMouseListener(this); 
     t->rescale(1.0f); 
     m_activeTables.push_back(t); 
     //rescaleTables(); 

     m_flow->add(t); 
     resizeFlow(); 
     updateScrollBars(); 
    } 

добавить таблицу в макет потока и второй пытается использовать его он выходит из строя.

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

Благодаря

+0

Вы называете конструктор в этой строке 'LobbyTable (m_fontMan, m_spriteMan, TABLEID)'? Если у вас есть tableId, это не значит, что таблица уже создана? –

+0

Он был создан с использованием бесполезного конструктора по умолчанию. – jmasterx

+0

Не следует ли обращаться к конструктору с вызовом ключевого слова 'new'? –

ответ

1

VC отладки строит инициализировать неинициализированные переменные 0xCCCCCCCC.

(list of special values)

Запустите программу под отладчиком, так что вы можете увидеть, на какой строке кода, что происходит. Если это не ваш код, перейдите в стек вызовов до тех пор, пока вы не попадете в «свой» код.

+0

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

+0

Проверьте, как инициализируется доступная переменная. (Исправляйте все другие вещи, прежде чем принимать кучное повреждение, поскольку это может вызвать всевозможные симптомы). – peterchen

+0

Тогда почему бы не работать со списком std, куда я бы отступил? – jmasterx

0

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

У меня были подобные проблемы при переходе от кучи стек перед ...

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