2016-05-22 2 views
-3

Я пытаюсь выделить массив указателей на структуру, но с моим кодом что-то не так.Не удалось выделить массив указателей на struct

Это моя структура:

struct Brick { 
    GameObject2D* handle_; 
}; 

Brick** bricks_; 

И это, как я пытаюсь выделить память для него:

int bricks_amount_ = 10;  

bricks_ = (Brick**)malloc(sizeof(Brick*) * bricks_amount_); 

Катастрофа программа. Я сделать Devenv на нем отладить, где проблема и аварии на этой линии:

for (unsigned short int i = 0; i < bricks_amount_; i++){ 
    bricks_[i]->handle_ = new GameObject2D(); <---------- CRASH! 
} 

Любые предложения?

PS: Извините за мой английский: P

================================ =========================================

[РЕШЕНИЕ]

Наконец я решил использовать зЬй :: вектор вместо сырых указателей:

bricks_.resize(bricks_amount_); 

, но я пытался сделать таНос другой путь, и это тоже работает:

bricks_ = (struct Brick*)malloc(sizeof(struct Brick) * bricks_amount_); 

или это:

bricks_ = new Brick[bricks_amount_]; 

Спасибо людям, которые хотят, чтобы помочь!

+2

Ясно 'bricks_ [i] -> handle_' обращается к неинициализированной памяти. 'bricks_ [i]' не присвоено значение. –

+1

Также не смешивайте 'malloc()' и 'new()', используйте 'new []' для выделения массивов. –

+0

Дополнительные пояснения к комментарию @KerrekSB '(+1): malloc создает полезный массив, но содержимое неинициализировано, что означает, что ваши указатели на Brick * находятся на полностью случайном значении, возможно, нулевом, возможно, указывающем за пределами звезд. Что вы пропустили: 'game_state_.bricks_ [i] = new Brick();', e. г. прямо перед вашим сбоем, чтобы инициализировать каждый указатель внутри массива. – Aconcagua

ответ

0

Это C++:

  • не используют malloc, используйте new
  • не используют простые массивы, используйте std::vector или std::array
  • не используют сырые указатели, используйте std::unique_ptr
+3

Хорошие моменты, но не решение реальной проблемы ... – Aconcagua

+1

Что-то вроде этого: bricks_ = new Brick [bricks_amount_]; – tonimarquez84

-1

Не использовать

Bricks ** //will be a 2 dimensional array 

Используйте вместо

Bricks * //will be a 1 dimensioanal array 

Если вы хотите один одномерный массив

Затем сделайте

`Bricks * bricks_ = (Bricks *)malloc(sizeof(Brick) * bricks_amount_); 

` 

Тогда вы можете спокойно обойтись без аварии

for (unsigned short int i = 0; i < bricks_amount_; i++){ 


bricks_[i]->handle_ = new GameObject2D(); <---------- There will not be CRASH! 
} 
+1

Неправильно - с помощью malloc вы все равно получаете унифицированный массив (который необходимо инициализировать с помощью конструктора размещения!). Кроме того, таким образом, вам нужно использовать 'bricks [i] .handle_'. – Aconcagua

+0

Yup @Aconcagua, вы правы, они все еще являются унициализированными указателями, но если структура содержит только 1 указатель, и они будут добавлены с новым на следующем шаге, тогда это будет хорошо. –

+1

Еще вы обошли контрструктора (помните, это C++), и если когда-либо класс Brick изменяется (точнее: получает не членов POD), вы можете столкнуться с проблемой (хорошо, вы все равно можете вызвать соответствующие конструкторы размещения для каждого члена типа :: std :: string, :: std :: vector или любого другого класса :: myNamespace :: MyClass используется - и изменяйте свой цикл каждый раз, когда изменяется класс Brick). – Aconcagua

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