В вашем примере кода:
for(int i = 0; i < 2; i++){
MYSTRUCT *mystruct;
}
Вы не создаете объекты на всех. Все, что вы делаете, это Объявление Указатели на MYSTRUCT
. Эти указатели неинициализированы и поэтому не указывают ни на что (пока). Более того, указатель (mystruct
) сам выделяется в стеке и имеет время жизни, ограниченное областью вашего цикла for-loop.
Я не уверен, чего вы пытаетесь достичь, но если вам нужно несколько объектов типа MYSTRUCT
, вы не должны пытаться их создать в таком цикле. Скорее, объявите массив или std::vector
и выполните инициализацию соответствующим образом. Я оставлю это вам, чтобы выяснить, как это сделать. Когда вы это сделаете, помните о различии между статическими и динамическими массивами и их последствиях для управления памятью!
EDIT: По желанию, я буду подробно останавливаться на заключительном фрагменте кода вы предоставили:
vector<MYSTRUCT *> mystructs;
for(int i = 0; i < 100; i++){
MYSTRUCT *mystruct;
mystructs.push_back();
}
Что происходит здесь вы объявляете пустой вектор указателей на MYSTRUCT
. Все идет нормально. Теперь, судя по телу, вы хотите заполнить этот вектор указателями на реальные объекты, но это не происходит в вашем коде. Я сомневаюсь, что это даже скомпилируется, учитывая, что push_back
требует в качестве аргумента MYSTRUCT*
. Поэтому, чтобы делать то, что вы собираетесь делать, ваш код должен в каждой итерации:
- Выделяет объект на куче.
- Наведите указатель на этот объект в обратном направлении от вектора.
Это будет выглядеть следующим образом:
vector<MYSTRUCT*> vec;
for (int i = 0; i != n; ++i) // pre-incr is good practice!
vec.push_back(new MYSTRUCT); // optionally add constructor arguments
Однако, это вводит вас новые обязанности: ты один запрос памяти явно с помощью new
, поэтому вы должны освободить память явным образом с помощью delete
.Если MYSTRUCT
является полиморфным (содержит виртуальных членов), вы можете легко обойти это (даже это - полиморфный, вы не должны этого делать, но это еще одна тема).
Ответ на этот вопрос: не хранить указатели, хранить объекты:
vector<MYSTRUCT> vec; // no pointer!
for (int i = 0; i < 100; ++i)
vec.push_back(MYSTRUCT()); // create an unnamed instance and copy to the back of the vec
Там, вы только что создали вектор n
экземпляров MyStruct. Нет указателей, нет new
и delete
, просто и легко!
Ваш поиск концепции «Массив». – JBL
Сделайте шаг назад. Вам нужно использовать указатели на структуры вообще? Почему вы делаете то, что делаете? –
Я не думаю, что указатель - это то, что вы хотите. Если вы новичок в этой памяти, каждый из них будет уникальным, имя не имеет значения. Хотя JBL прав, то, что вы ищете, называется массивом. Или список/вектор. – marsh