Возвращает адреса объектов, созданных вне функции main()

StackOverflow https://stackoverflow.com/questions/607677

  •  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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top