Возвращает адреса объектов, созданных вне функции main()
-
03-07-2019 - |
Вопрос
Я пытаюсь создать список ссылок, но у меня возникают проблемы с созданием объектов внутри функции и назначением указателей на их адреса, поскольку я считаю, что они выходят за пределы области видимости при завершении функции.Это правда?И, если да, то как я могу создать объект вне основного и при этом использовать его?
Решение
Создайте объекты с помощью оператора new.т. е.
void foo( myObject* bar1, myObject* bar2 )
{
bar1 = new myObject();
bar2 = new myObject();
// do something
}
int main( int argc, char* argv[] )
{
myObject* thing1;
myObject* thing2;
foo( thing1, thing2 );
// Don't forget to release the memory!
delete thing1;
delete thing2;
return 0;
}
Другие советы
Вы правы, локальные переменные выйдут за пределы области видимости в конце функционального блока.Вам нужно создать указатели на объекты и выделить их с помощью новое.И не забудьте удалить объект, когда будете удалять его из своего списка.
Если вы не хотите иметь дело с неприятностями и ошибками, которые сопровождают указатели, смотрите повышение::shared_ptr вместо этого.
используйте новый оператор:
void f()
{
CMyObject *p = new CMyObject();
List.AddTail(p); // Or whatever call adds the opbject to the list
}
Обратите внимание на удаление объектов, когда ваш список будет уничтожен.
Почему вы не храните объекты (не указатели на объекты) в списке?Creator-функция вернет объект.
Если вам действительно нужен список указателей, рассмотрите возможность использования специальных контейнеров списка указателей (boost::ptr_list
) или хранение в нем интеллектуальных указателей (boost::shared_ptr
).Чтобы предотвратить выход объектов за пределы области видимости после возврата из функции, вам необходимо динамически распределять их с помощью operator new .
Общепринятый ответ неверен.В функции
void foo( myObject* bar1, myObject* bar2 )
{
bar1 = new myObject();
bar2 = new myObject();
// do something
}
вновь выделенному объекту присваиваются локальные переменные.Они не влияют на значения указателей в вызывающей функции.
int main( int argc, char* argv[] )
{
myObject* thing1;
myObject* thing2;
foo( thing1, thing2 ); // thing1 and thing2 don't get assigned
// They continue to be uninitialized in
// this function
// Don't forget to release the memory!
delete thing1; // These two deletes will lead to undefined behavior.
delete thing2;
return 0;
}
Все, что вам нужно, это:
void foo( myObject*& bar1, myObject*& bar2 )
{
bar1 = new myObject(); // Now the value of the pointers in the calling
bar2 = new myObject(); // will be changed since the pointers are passed by reference.
// do something
}