Передача указателя все глубже и глубже через функции - PullRequest
0 голосов
/ 05 марта 2012

У меня есть сетевая структура, которую я пишу (пытаясь реализовать надежный уровень поверх UDP). У меня есть эта функция получения, которая принимает указатель на объект пакета. Сетевая структура затем выполняет всю загрузку, чтобы получить пакет, и устанавливает значение указателя пакета на этот пакет. Но это происходит несколько функций глубоко. Итак, что меня по сути интересует, так это то, почему мне это не нравится: (очень простой пример, показывающий, что я имею в виду)

void Main()
{
   int* intPointer = NULL;
   SomeFunction(intPointer);
   //intPointer is still null?
}
void SomeFunction(int* outInt)
{
   SomeOtherFunction(outInt);
}

void SomeOtherFunction(int* outInt)
{
   outInt = new int(5);
}

Ответы [ 2 ]

5 голосов
/ 05 марта 2012

SomeOtherFunction передается указатель по значению, поэтому присваивание изменяет только локальную копию переданного адреса.

Чтобы сделать это, передайте указатель по ссылке:

void Main()
{
   int* intPointer = NULL;
   SomeFunction(intPointer);
   //intPointer is still null?
}
void SomeFunction(int*& outInt)
{
   SomeOtherFunction(outInt);
}

void SomeOtherFunction(int*& outInt)
{
   outInt = new int(5);
}

Сказав это, что-то не так с использованием возвращаемого значения?

void Main()
{
   int* intPointer = SomeFunction(intPointer);
   //intPointer is still null?
}
int* SomeFunction()
{
   return SomeOtherFunction();
}

int* SomeOtherFunction()
{
   return new int(5);
}

[Обновить следующий комментарий. ]

Что ж, если у вас есть возвращаемое значение, указывающее статус, предположительно указывающее, было ли прочитано целое число или нет, то то, что вы действительно хотите (используя bool в качестве заполнителя для вашего конкретного статуса):

void Main()
{
   int intPointer = 0;
   if (SomeFunction(intPointer) == true)
   {
       // read something
   }
   else
   {
       // failed to read.
   }
}
bool SomeFunction(int& outInt)
{
   return SomeOtherFunction(outInt);
}

bool SomeOtherFunction(int& outInt)
{
   outInt = 5;
   return true;
}
0 голосов
/ 05 марта 2012

Лучше использовать пустой std :: auto (unique) _ptr, переданный как ссылка на SomeOtherFunction и SomeFunction. Если SomeFunction вызывает исключение, у вас не будет утечки памяти для памяти, выделенной в SomeOtherFunction

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...