URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9344
[ Назад ]

Исходное сообщение
"check valid returned reference"

Отправлено handler2006 , 01-Янв-12 15:30 
Здравствуйте!
Предположим, у нас имеется функция:

char* f()
{
     char *ch = new(nothrow) char[1];
     return (ch)? ch : -1;
}

Таким образом, мы проверяем валидность возвращаемого указателя.
А теперь предположим, что наша функция возвращает не указатель а ссылку на объект(определенный пользователем, в самом худшем случае)


class A;

A& f()
{
     A a;
     return a;
}


Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку, либо -1 ?
Спасибо

Содержание

Сообщения в этом обсуждении
"check valid returned reference"
Отправлено Alex , 01-Янв-12 18:01 
>[оверквотинг удален]
> class A;
> A& f()
> {
>      A a;
>      return a;
> }
>

> Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку,
> либо -1 ?
> Спасибо

Во-первых не "return a;", а "return &a;"

Во-вторых: Определить в пользовательском классе метод, кот. возвращает ссылку вида "return this;" если все ресурсы нормально инициализированы


"check valid returned reference"
Отправлено handler2006 , 01-Янв-12 22:21 
Вы все перепутали - указанные Вами варианты относятся к первому методу с использованием указателей.
Фактически, ссылка и указатель - одно и то же, за исключением того, что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается на объект, ее нельзя объявить без инициализации, хотя затем объект, на который ссылается ммылка, может быть удален.
Так вот вопрос: как проверить валидность ссылки?

"check valid returned reference"
Отправлено Alex , 02-Янв-12 12:15 
> Вы все перепутали - указанные Вами варианты относятся к первому методу с
> использованием указателей.
> Фактически, ссылка и указатель - одно и то же, за исключением того,
> что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается
> на объект, ее нельзя объявить без инициализации, хотя затем объект, на
> который ссылается ммылка, может быть удален.
> Так вот вопрос: как проверить валидность ссылки?

Думаю Вы не первый, кто столкнулся с данной проблемой. Я для себя сделал класс-обертку над указателем и методы get,set, reset, close, кот. обрабатывают адекватно указатель.

class A{
  char *i;
public:
  A(){i=NULL;};
  char *get(){if(i!=NULL) return i; else return NULL;}
  char set(char &str){
          if(str != NULL){if(i!=NULL) i = str; else{ delete[] i; i = str}}
  }
  char close(){delete[] i; i = NULL;}
};

но тут возникает другая проблема - методы данного класса работают с "внешним" блоком памяти, и если вызван close, а со старым указателем, что либо делают - то экзепшн не избежать. Другого выхода лично я не вижу.


"check valid returned reference"
Отправлено del , 24-Фев-12 14:11 
>[оверквотинг удален]
> class A;
> A& f()
> {
>      A a;
>      return a;
> }
>
> Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку,
> либо -1 ?
> Спасибо

facepalm. Возврат ссылки на локальный объект...


"check valid returned reference"
Отправлено Alex_S , 02-Мрт-12 03:30 

> facepalm. Возврат ссылки на локальный объект...

да ладно вам.. может, автор фрагментацию памяти изучает  ;)


"check valid returned reference"
Отправлено pavlinux , 02-Мрт-12 22:50 
> Здравствуйте!
> Предположим, у нас имеется функция:
>
 
> char* f()
> {
>      char *ch = new(nothrow) char[1];
>      return (ch)? ch : -1;
> }
>

Зачем в С++ юзать чистый С??? Вам чё, стринги малы, напурква чар?