Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проверить содержимое указателя


Автор: GKosh 27.5.2006, 07:43
Идея проста - определить убитый указатель, писал так:

Код

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

    return true;
}


Понятно, что если нулевые указатели в алгоритме в порядке вещей, то перехват постоянно возникающих исключений поставит производительность на колени.
Ест ли какой-нибудь более приемлимый вариант решения этой же задачи, который мог бы применяться и тогда, когда убитые указатели попадаются в алгоритме очень часто?
 

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

В том виде, в котором ты хочешь переносимого решения нет.
Но есть совершенно простой способ: перед началао выполнения твоего алгоритма обнуляй все переменные-указатели, тогда потом в функции тест(она кстати изначально вообще  не правильно написана у тебя) делаешь проверку if( p_var ) и определяешь сразу "вкусность" указателя smile 

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

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

Расскажи, пожалуйста, по больше об умных указателях. На сколько они удобны в использовании? Как они определяют, что пора очищать память на которую они указывают?   

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

Автор: MAKCim 28.5.2006, 09:27
Цитата

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

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

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), связывания ссылок, деструктивного копирования
подробнее у Александреску 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)