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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс "массив в спец. памяти", template & static... 
:(
    Опции темы
AlexDon
Дата 11.8.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую всех!
У меня такая проблема:
С помощью template определяю класс массив в спец. области памяти. Для выделения и освобождения памяти под массив используется специальный менеджер памяти. 
Вопрос: как сделать так, чтобы этот специальный менеджер прекращал работу после того как вызовутся все деструкторы массивов?

P.S. Программа пишется на Borland 3.1

PM MAIL   Вверх
Dragon
Дата 11.8.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 10.8.2006
Где: Киев

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



1. Почему настолько старый компилятор? Проблемы могут быть спецефическими для компилятора. Есть возможность изменить?
2. Нужен код.

Но в целом так. Нужно так или иначе реализовать счетчик объектов, и обработчик в деструкторе массива который непосредственно уничтожит менеджера, когда счетчик обнулится.

Естественно, ты можешь создать малый класс ManagerObserver с виртуальным деструктором и наследовать от него всю иерархию классов обработчиков. Счетчик можешь определить статической переменной в private секции. Если есть потоки, там же определяешь Mutex. Конструктор инкрементирует счетчик, деструктор декрементирует и проверяет на 0.

Но, действительно, нужен код smile


Это сообщение отредактировал(а) Dragon - 11.8.2006, 12:41
PM MAIL ICQ   Вверх
AlexDon
Дата 11.8.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1) компилятор такой, потому что работаю под DOS 6.22 (PC- совместимый контроллер). 
2) template не терпит никаких статических переменных.
3) код примерно такой:

Код

template <class T> class my_array {
private:
  Mem_upr *mgr; // указатель на менеджер специальной памяти
  unsigned long ptr;  // вместо указателя на память
public:
  my_array (unsigned long dlina) {
    mgr = get_mgr ();  // вот здесь можно вызвать конструктор менеджера при первом вызове...
    ptr = mgr->get_mem(dlina*sizeof(T));  // запрос блока памяти
  }
  ~my_array () {
    if (ptr) {
      mgr->free_mem(ptr);  // освобождение...
    }
  }
  void setvalue (T *src,unsigned long index,unsigned dlina) {  // запись в память
    if (ptr) {
      set_mem (src,ptr+index*sizeof(T),dlina*sizeof(T));
    }
  }
  void getvalue (T *dst,unsigned long index,unsigned dlina) {  // чтение памяти
    if (ptr) {
      get_mem (dst,ptr+index*sizeof(T),dlina*sizeof(T));
    }
  }
};



  Как сделеать так, чтобы деструктор менеджера памяти вызывался после всех деструкторов my_array<>?

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 10.8.2006
Где: Киев

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



Думаю, так:
Код

class ManagerObserver
{
public:
    ManagerObserver() { arraysCounter++; }
    virtual ~ManagerObserver()
    {
        arraysCounter--;
        if(!arraysCounter) destroy_mgr();            // Or something like this
    }
private:
    static size_t arraysCounter;
};
size_t ManagerObserver::arraysCounter = 0;

template <class T, class ObserverPolicy = ManagerObserver> class my_array : public ObserverPolicy {
{
public:
    virtual ~my_array () { /* ... */ }
    // ...
};



Или по паттерну Observer/Observable - суть та же. Насколько я знаю, автоматических средств не существует. Если 3.1 не поддерживает стратегии, можно просто:

Код

template <class T> class my_array : public ManagerObserver {
{
public:
    virtual ~my_array () { /* ... */ }
    // ...
};



Это сообщение отредактировал(а) Dragon - 11.8.2006, 14:20
PM MAIL ICQ   Вверх
MAKCim
Дата 11.8.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

class count_strategy
{
private:
    int* counter;
public:
    count_strategy()
        : counter(new int(1)) {}

   count_strategy& operator++()
        { ++*counter; return *this; }

   count_strategy& operator--()
        { --*counter; return *this; }

   bool empty() const {return *counter==0; }

   void destroy() { delete counter; counter=0; }
};

template <class T, class Behaviour=count_strategy> 
    class my_array {
private:
  Mem_upr *mgr; // указатель на менеджер специальной памяти
  unsigned long ptr;  // вместо указателя на память
  Behaviour str;
private:
  void destruct()
  {
    --str;
    if (str.empty())
    {
      delete mgr;
      str.destroy();
    }
  }
public:
  my_array (unsigned long dlina) {
    mgr = get_mgr ();  // вот здесь можно вызвать конструктор менеджера при первом вызове...
    ptr = mgr->get_mem(dlina*sizeof(T));  // запрос блока памяти
  }

  my_array(const my_array<T,Behaviour>& ref) 
      : mgr(ref.mgr), ptr(ref.ptr), str(ref.str)
  {
    ++str;
  }

  my_array<T,Behaviour>& operator=(const my_array<T,Behaviour>& ref)
  {
    destruct();
    mgr=ref.mgr;
    ptr=ref.ptr;
    str=ref.str;
    ++str;
  }

  ~my_array () {
    if (ptr) {
      mgr->free_mem(ptr);  // освобождение...
    }
    destruct();
  }
  void setvalue (T *src,unsigned long index,unsigned dlina) {  // запись в память
    if (ptr) {
      set_mem (src,ptr+index*sizeof(T),dlina*sizeof(T));
    }
  }
  void getvalue (T *dst,unsigned long index,unsigned dlina) {  // чтение памяти
    if (ptr) {
      get_mem (dst,ptr+index*sizeof(T),dlina*sizeof(T));
    }
  }
};



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

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.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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