Возвращение адресов объектов, созданных вне функции main () - PullRequest
0 голосов
/ 03 марта 2009

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

Ответы [ 5 ]

3 голосов
/ 03 марта 2009

Вы правы, локальные переменные выйдут из области видимости в конце функционального блока. Вам необходимо создать указатели на объекты и выделить их с помощью new . И не забудьте удалить объект, когда вы удалите его из списка.

Если вы не хотите иметь дело с трудностями и ошибками, которые идут с указателями, см. boost :: shared_ptr .

2 голосов
/ 03 марта 2009

используйте новый оператор:

void f()
{
  CMyObject *p = new CMyObject();
  List.AddTail(p); // Or whatever call adds the opbject to the list
}

Обратите внимание на удаление объектов при уничтожении списка.

0 голосов
/ 28 октября 2014

Принятый ответ не верен. В функции

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
}
0 голосов
/ 03 марта 2009

Почему вы не храните объекты (не указатели на объекты) в списке? Создатель-функция вернет объект.

Если вам действительно нужен список указателей, рассмотрите возможность использования специальных контейнеров списка указателей (boost::ptr_list) или хранения в нем интеллектуальных указателей (boost::shared_ptr). Чтобы предотвратить выход объектов из области видимости после возврата из функции, вам необходимо динамически распределить их с помощью оператора new.

0 голосов
/ 03 марта 2009

Создание объектов с новым оператором. т.е.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...