невозможность удаления указателя
От: Fynjisx  
Дата: 21.07.08 08:01
Оценка:
Привет Всем!
Проблдема в следующем:
1. для своего некоторого члена, класс выделяет память из кучи;
2. В классе существует метод, который возвращает указатель на эту память;
так вот как сделать так, чтоб возвращенный указатель нельзя было бы удалить во внешней программе???
т.е чтоб только класс её мог дельнуть.
Заранее благодарю.
С уважением Fynjisx
Re: невозможность удаления указателя
От: placement_new  
Дата: 21.07.08 08:21
Оценка:
Здравствуйте, Fynjisx, Вы писали:

F>Привет Всем!

F>Проблдема в следующем:
F>1. для своего некоторого члена, класс выделяет память из кучи;
F>2. В классе существует метод, который возвращает указатель на эту память;
F>так вот как сделать так, чтоб возвращенный указатель нельзя было бы удалить во внешней программе???
F>т.е чтоб только класс её мог дельнуть.

держать в классе shared_ptr, а возвращать weak_ptr?
Re: невозможность удаления указателя
От: Pasternak  
Дата: 21.07.08 08:25
Оценка:
Здравствуйте, Fynjisx, Вы писали:

F>Привет Всем!

F>Проблдема в следующем:
F>1. для своего некоторого члена, класс выделяет память из кучи;
F>2. В классе существует метод, который возвращает указатель на эту память;
F>так вот как сделать так, чтоб возвращенный указатель нельзя было бы удалить во внешней программе???
F>т.е чтоб только класс её мог дельнуть.

Использовать shared_ptr или сделать обертку над указателем со всеми необходимыми методами. Для указателя на класс может оказаться вполне достаточно и этого:


template<typename T>
class Pointer {
    public:
        Pointer(T* p) : pointer_(p) {}

        T* operator->() const {return pointer_;}

    private:
        T* pointer_;
};


Если это указатель на массив, то необходимо переопределить operator[]. Если указатель необходимо передать какойто С-шной функции, можно подумать о том, чтобы добавить метод в обертку вызывающий данную С функцию. Ну и так далее и в том же духе.
Re: невозможность удаления указателя
От: Bell Россия  
Дата: 21.07.08 08:26
Оценка:
Здравствуйте, Fynjisx, Вы писали:

F>Привет Всем!

F>Проблдема в следующем:
F>1. для своего некоторого члена, класс выделяет память из кучи;
F>2. В классе существует метод, который возвращает указатель на эту память;
F>так вот как сделать так, чтоб возвращенный указатель нельзя было бы удалить во внешней программе???
F>т.е чтоб только класс её мог дельнуть.

Например можно возвращать некий прокси-объект, у которого перегружен operator->.
Любите книгу — источник знаний (с) М.Горький
Re: невозможность удаления указателя
От: dont.avt Украина  
Дата: 21.07.08 08:47
Оценка:
Здравствуйте, Fynjisx, Вы писали:

F>Привет Всем!

F>Проблдема в следующем:
F>1. для своего некоторого члена, класс выделяет память из кучи;
F>2. В классе существует метод, который возвращает указатель на эту память;
F>так вот как сделать так, чтоб возвращенный указатель нельзя было бы удалить во внешней программе???
F>т.е чтоб только класс её мог дельнуть.

Закрой у члена класса деструктор. Агрегирующий класс сделай другом члена.
Re: невозможность удаления указателя
От: Аноним  
Дата: 21.07.08 08:48
Оценка:
class IReturned
{
public:
virtual ~IReturned(){} = 0;
};

class Returner
{
class Returned : public IReturned
{
bool _can_delete;
public:
Returned():_can_delete(false)
{
}
virtual ~Returned()
{
if (!_can_delete)__asm int 3;
}
void AllowDelete()
{
_can_delete = true;
}
};
Returned _returned;
public:
~Returner()
{
_returned.AllowDelete();
}
IReturned *GetIt()
{
return &returned
}
};


Дада, я злой, и делаю неправильный мед
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.