Retornando os endereços dos objetos criados fora do main () função
-
03-07-2019 - |
Pergunta
Eu estou tentando criar uma lista de links, mas estou tendo problemas para criar objetos dentro de uma função e atribuir ponteiros para seus endereços, desde que eu acredito que eles saem de escopo quando a função sai. Isso é verdade? E, em caso afirmativo, como posso criar um objeto fora do principal e ainda usá-lo?
Solução
Criar os objetos com o novo operador. ie
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;
}
Outras dicas
Você está correto, variáveis ??locais vai sair do escopo no final do bloco de função. Você precisa criar ponteiros para os objetos e alocá-los com nova . E não se esqueça de excluir o objeto quando você removê-lo da sua lista.
Se você não quer lidar com as dificuldades e os erros que vêm com ponteiros, consulte boost :: shared_ptr .
usar o novo operador:
void f()
{
CMyObject *p = new CMyObject();
List.AddTail(p); // Or whatever call adds the opbject to the list
}
Preste atenção à exclusão de objeto quando sua lista é destruída.
Por que você não armazenar objetos (não ponteiros para objetos) na lista? Criador-função retornará objeto.
Se você realmente lista de ponteiros precisa considerar o uso de recipientes de lista ponteiro especiais (boost::ptr_list
) ou armazenar ponteiros inteligentes nele (boost::shared_ptr
). Para evitar objetos que vão fora do escopo após retornar de função, você precisa alocá-los dinamicamente com o operador de novo.
A resposta aceita não está certo. Na função
void foo( myObject* bar1, myObject* bar2 )
{
bar1 = new myObject();
bar2 = new myObject();
// do something
}
o objeto recém-alocado são atribuídos a variáveis ??locais. Elas não afetam os valores dos ponteiros na função de chamada.
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;
}
O que você precisa é:
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
}