The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"check valid returned reference"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"check valid returned reference"  +/
Сообщение от handler2006 email(ok) on 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 ?
Спасибо
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "check valid returned reference"  +/
Сообщение от Alex (??) on 01-Янв-12, 18:01 
>[оверквотинг удален]
> class A;
> A& f()
> {
>      A a;
>      return a;
> }
>
> Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку,
> либо -1 ?
> Спасибо

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "check valid returned reference"  +/
Сообщение от handler2006 email(ok) on 01-Янв-12, 22:21 
Вы все перепутали - указанные Вами варианты относятся к первому методу с использованием указателей.
Фактически, ссылка и указатель - одно и то же, за исключением того, что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается на объект, ее нельзя объявить без инициализации, хотя затем объект, на который ссылается ммылка, может быть удален.
Так вот вопрос: как проверить валидность ссылки?
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "check valid returned reference"  +/
Сообщение от Alex (??) on 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, а со старым указателем, что либо делают - то экзепшн не избежать. Другого выхода лично я не вижу.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "check valid returned reference"  +/
Сообщение от Alex_S (??) on 02-Мрт-12, 03:30 

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру