Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверить содержимое указателя, if (pointer) 
:(
    Опции темы
GKosh
Дата 27.5.2006, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 27.12.2005

Репутация: нет
Всего: нет



Идея проста - определить убитый указатель, писал так:

Код

bool test(IObject* pointer)
{
    try
    { 
        pointer->is_alife();
    }
    catch ( ... )
    { 
        pointer = 0;
        return false;
    }

    return true;
}


Понятно, что если нулевые указатели в алгоритме в порядке вещей, то перехват постоянно возникающих исключений поставит производительность на колени.
Ест ли какой-нибудь более приемлимый вариант решения этой же задачи, который мог бы применяться и тогда, когда убитые указатели попадаются в алгоритме очень часто?
 
PM MAIL   Вверх
Daevaorn
Дата 27.5.2006, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(GKosh @  27.5.2006,  08:43 Найти цитируемый пост)
Ест ли какой-нибудь более приемлимый вариант решения этой же задачи

В том виде, в котором ты хочешь переносимого решения нет.
Но есть совершенно простой способ: перед началао выполнения твоего алгоритма обнуляй все переменные-указатели, тогда потом в функции тест(она кстати изначально вообще  не правильно написана у тебя) делаешь проверку if( p_var ) и определяешь сразу "вкусность" указателя smile 
PM MAIL WWW   Вверх
MAKCim
Дата 27.5.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



используй smart pointer-ы
и с удалением меньше проблем будет 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Empirik
Дата 27.5.2006, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 28.10.2005
Где: Россия, Пермь

Репутация: нет
Всего: 1



Цитата(MAKCim @ 27.5.2006,  08:46)
используй smart pointer-ы
и с удалением меньше проблем будет

Расскажи, пожалуйста, по больше об умных указателях. На сколько они удобны в использовании? Как они определяют, что пора очищать память на которую они указывают?   
--------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов
PM MAIL WWW ICQ   Вверх
Любитель
Дата 28.5.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Память освобождается в деструкторе. Если на один объект у тебя может несколько самрт-поинтеров, используй бустовские классы, там есть классы с подсчётом ссылок, а также классы для выделения памяти под массивы. (http://boost.org/libs/smart_ptr/smart_ptr.htm) 


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 28.5.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Как они определяют, что пора очищать память на которую они указывают? 

самая часто встречающаяся стратегия - подсчет ссылок
вкратце
Код

class reference_strategy
{
private:
    size_t* counter_;
public:
    reference_strategy()
        : counter_(new size_t(1)) {}
  
    void copy() {++*counter_;}

    bool destroy()
    {
        bool flag=--*counter_;
        if (!flag) delete counter_;
        return flag;
    }
};

а теперь сделаем простой smart pointer
Код

template<class Type> class smart_ptr
{
private:
    reference_strategy behaviour_;
    Type* ptr_;
...
private:
    typedef smart_ptr<Type> self_t;
public:
...
    smart_ptr(const self_t& obj)
        : behaviour_(obj.behaviour_), ptr_(obj.ptr_) {behaviour_.copy();}

    self_t& operator=(const self_t& obj)
    {
        if (!behaviour_.destroy()) delete ptr_;
        behaviour_=obj.behaviour_;
        ptr_=obj.ptr_;
        behaviour_.copy();
        return *this;
    }
...
};

есть еще стратегия глубокого копирования, копирования при записи (COW), связывания ссылок, деструктивного копирования
подробнее у Александреску 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.