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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двусвязный список шаблонных классов, а что если получится? 
V
    Опции темы
BearFear
Дата 25.9.2013, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вопрос вот в чем. Сам не знаю зачем мне это. Хотя цель примерно следующая: сохранить указашки на объекты и удалить если надо объекты вместе с хранителями их указателей. И вместо тысячи слов, быдлокод в студию!

Код

template <typename type> class owner {
public:
    owner(type* Object, owner* Left, owner* Right) {
        _Object = Object;
        _Left = Left;
        _Right = Right;
        
        if (_Left != NULL)
            _Left->_Right = this;
        
        if (_Right != NULL)
            _Right->_Left = this;
    }
    
    ~owner() {
        if (_Object != NULL)
            delete _Object;
    }
    
    void link_left(owner* Left) {
        _Left = Left;
    }
    
    void link_right(owner* Right) {
        _Right = Right;
    }
    
    owner* get_left() {
        return _Left;
    }
    
    owner* get_right() {
        return _Right;
    }
    
    void delete_this() {
        if (_Left != NULL)
            _Left->_Right = _Right;
        
        if (_Right != NULL)
            _Right->_Left = _Left;
        
        delete this;
    }
    
    void delete_chain() {
        ////    ....
        //    - создается вектор указателей на все следующие объекты цепи
        //    - удаляется каждый объект цепи из вектора
    }
    
private:
    type* _Object;
    
    owner* _Left;
    owner* _Right;
};


Использование

Код

int main(int argc, char** argv) {
    // Проверка размеров параметризированных классов
    owner<char> OwnerA(NULL, NULL, NULL);
    owner<long long> OwnerB(NULL, NULL, NULL);
    printf("%u %u\n", sizeof(OwnerA), sizeof(OwnerB));
    //    размеры совпадают, следовательно, произвольному стороннему классу в данном маневре пофигу
    //    чем параметризирован удаляемый объект. Хоть int, хоть char, хоть chinese_soldiers
    
    int* Int = new int; // создаем содержимое под который подгоняем наш шаблонокласс
    char* Char = new char; // создаем содержимое под который подгоняем наш шаблонокласс
    
    owner<int>* Owner_A = new owner<int>(Int, NULL, NULL); // создаем объект параметризируя типом хранимого в шаблоноклассе
    owner<char>* Owner_B = new owner<char>(Char, NULL, NULL); // аналогишно
    Owner_A->link_right(reinterpret_cast<owner<int>*>(Owner_B));
    Owner_B->link_left(reinterpret_cast<owner<char>*>(Owner_A));
    
    delete Owner_A;
    delete Owner_B;
    
    // Итого - мы можем иметь цепь анонимных объектов
    // мы можем производить наФигацию по цепи
    // мы фактически храним указатели на разные объекты и можем в случае "ЧО" слить всю цепь без последствий.
    // Правильно ли так поступать? Или кришна не на моей стороне?
    return 0;
}


Насколько опрометчиво использовать подобный подход?

Это сообщение отредактировал(а) BearFear - 25.9.2013, 17:38
PM MAIL   Вверх
volatile
Дата 25.9.2013, 18:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(BearFear @  25.9.2013,  17:30 Найти цитируемый пост)
Итого - мы можем иметь цепь анонимных объектов

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

PM MAIL   Вверх
BearFear
Дата 25.9.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А более подробно можно объяснить? Ведь удаление объекта - это освобождение определенного объема данных, никакой магии. В данном случае размер отслеживается. И о чем то другом уж лучше сказать, а то не очень понятно. Что не так?

Это сообщение отредактировал(а) BearFear - 25.9.2013, 19:40
PM MAIL   Вверх
akizelokro
Дата 25.9.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



пуристы сказали бы ещё, что Int и Сhar мало того, что не очень удачные названия переменных, но их и нужно delete перед завершением программы.

Скажу проще, что классический ООП фактически завершается после применения reinterpret_cast.
потому что в этом случае проще применять в owner указатели "void *" и без всякого шаблона, а дальше этот указатель приводить к желаемому для вас типу. (Или проще, такой код никому из сторонников объектно-ориентированной парадигмы не понравится, он методологически ближе к "выкрутасам" доброго старого С)


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
BearFear
Дата 25.9.2013, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Этот код не для того что бы удовлетворить эстетические потребности читающего. Это формулировка и вы сами прекрасно знаете, на скорую руку писать мегасверхкрасивый код смысла нет, он затрется. А на счет реинтерпрета согласен. Это и смущает. Но по факту, 12 байт размер данного по приведенному указателю. Не по приведенному размер такой же. В диспатчере МС просмотрел выделяемые данные. Вроди бы как освобождается норм. За кадром использовал более весомые данные для хранения в шаблоноклассах. Это меня и смутило - неужели работает? Хотелось бы услышать более глубокие ответы, как от профессионалов. Теоретически я и сам не согласен с этим кодом по множеству пунктов и лишний раз напоминать об эстетике каких то моментов... ну господа, это не серьезно.

Добавлено через 7 минут и 6 секунд
akizelokro, в деструкторе owner (за пределами main - там при прочтении всего сообщения) есть delete тех некрасивых Int и Char. Ребят, если вам не интересно, то ну не пишите и не читайте совсем тогда. Вы и себе время сэкономите и мне не придется как то реагировать на заведомо "недочитанное" вами  smile 
PM MAIL   Вверх
akizelokro
Дата 25.9.2013, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(BearFear @  25.9.2013,  20:42 Найти цитируемый пост)
 в деструкторе owner (за пределами main - там при прочтении всего сообщения) есть delete тех некрасивых Int и Char. Ребят, если вам не интересно, то ну не пишите и не читайте совсем тогда. Вы и себе время сэкономите и мне не придется как то реагировать на заведомо "недочитанное" вами


Прошу прощения, просто не ожидал.

ну, этот код и должен быть работоспособным кодом. До того момента, пока этот кусок кода не попадёт в посторонние руки и не начнутся возможные правки класса owner. Так что посоветовал бы поставить спецификатор "final".

Это сообщение отредактировал(а) akizelokro - 25.9.2013, 21:02


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
BearFear
Дата 25.9.2013, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Высокомерие?  smile 
PM MAIL   Вверх
akizelokro
Дата 25.9.2013, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(BearFear @  25.9.2013,  21:02 Найти цитируемый пост)
Высокомерие?


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



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
BearFear
Дата 25.9.2013, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да. Это самый минимальный из минимального. Больше никаких пристроек. Вообще, хотел сделать некое подобие очищалки, для более безопасного вызова экцепшенов. В случае экцепшена опрашивается манагер цепи и он то уже зачищает все новые объекты. В общем самый важный и важнее всех важных вопросов данного топика - есть ли подводные камни именно у этого кода. Не гепотетически, не предполагая всевозможных других использований (не люблю гонку за полтергейстами), а именно то как вот есть. Сам принцип. А небезопасности везде хватает. По дурости как говорится можно и луже утонуть. чтож теперь, бегать за лужами и знаки ставить? Или того лучше дружиников заставить дежурить у луж?  smile 

Вообще, у меня есть мой парсер, один экземпляр которого я заточил под С++. Он, делает забеги по коду, делает определенные выводы по типам и их использовании и снимает все RTTI в нужных местах. Они обособляются макросами. Но это уже другая история. Решил разнообразиться, вдруг найдется иной способ хранения разных типов в одном месте без последствий в виде утечки.

Это сообщение отредактировал(а) BearFear - 25.9.2013, 21:14
PM MAIL   Вверх
baldina
Дата 25.9.2013, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



прочитал два раза, но не уверен что понял зачем все это. если цель в
Цитата(BearFear @  25.9.2013,  17:30 Найти цитируемый пост)
// Итого - мы можем иметь цепь анонимных объектов
    // мы можем производить наФигацию по цепи
    // мы фактически храним указатели на разные объекты и можем в случае "ЧО" слить всю цепь без последствий.

то не проще ли что-нить вроде std::list<std::shared_ptr<boost::any>>>? причем без косяков в отношении типов, о которых сказал volatile. 
PM MAIL   Вверх
BearFear
Дата 25.9.2013, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Шаред поинтер сработает в случае SEH? Интересно, где я был когда ввели такую возможность в буст?  smile 
Если бы я спросил про АНАЛОГИ, может было бы и к месту. Программистов считают людьми, которые воспринимают все слишком буквально. В данных случаях очень много "неявностей" пришлось увидеть. Неизвестные кодеры которые якобы могут вмешаться в код. Предположение о поиске аналогов... Эх, или я не так выражаюсь или собеседники непонятливые.

Уважаемые, о том ЗАЧЕМ это нужно я уж как то сам разберусь. Тема ведь не - помогите разобраться зачем мне это и как это использовать?

Это сообщение отредактировал(а) BearFear - 25.9.2013, 22:10
PM MAIL   Вверх
baldina
Дата 26.9.2013, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(BearFear @  25.9.2013,  22:09 Найти цитируемый пост)
Шаред поинтер сработает в случае SEH?

точно так же, как и ~owner()
зачем вам SEH я не спрашиваю, т.к. это не моё дело и вопрос не об этом  smile 

Цитата(BearFear @  25.9.2013,  22:09 Найти цитируемый пост)
Уважаемые, о том ЗАЧЕМ это нужно я уж как то сам разберусь.

никто в этом и не сомневается. но раз вопрос задан, нам тоже надо немного понять о чем идет речь. из кода вашего логическая цепь у меня как-то не выстроилась...
вопрос был "насколько опрометчиво", не уточняя, с какой позиции рассматривать. скажем, с позиции повторного использования - опрометчиво. с позиции концепции сборки мусора - опрометчиво. с позиции масштабирования - ну если не опрометчиво, то как минимум сомнительно. с позиции С++ после замечания volatile и вашей ремарки, что "удаление объекта это лишь освобождение объема данных" и говорить нечего. 

PM MAIL   Вверх
BearFear
Дата 26.9.2013, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вызвать ~owner из seh хандлера куда проще чем n деструкторов по неизвестным адресам. Поэтому я могу даже гарантировать, что ~owner будет вызван.
Ну смысл получается таким - после маин следует стековая процедура создающая синглтон-манагер, который отвечает за создание и очистку двусвязного списка. В используемом окружении все  кроме некоторых POD создается динамически. Это уже устоявшийся паттерн, который гарантирует динамическое созданиеотсутствие конструктора копирования и отсутствие ненужных операторов. Есть даже  макрос который сокращает путь создания. POD типы, или чаще это структуры, оборачиваются при динамическом создании. Разумеется, метод паттерна может включать код добавления СЕБЯ в список. Это будет рано 1-2 присваиваниям. Если seh - вызывается цепь деструкторов. Достаточно корневому объекту подать команду. Если не seh, то в стековой процедуре инита окружения вызывается та же цепь деструктуров. Но опять же, описаное выше как то изменит наличие ошибки в коде первого сообщения? Нет. Поэтомуя сразу и написал, что сам не знаю зачем оно мне. Что бы вопросов не было.

Это сообщение отредактировал(а) BearFear - 26.9.2013, 07:51
PM MAIL   Вверх
volatile
Дата 26.9.2013, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(BearFear @  25.9.2013,  19:38 Найти цитируемый пост)
А более подробно можно объяснить? Ведь удаление объекта - это освобождение определенного объема данных, никакой магии. В данном случае размер отслеживается.


BearFear, просто попробуйте написать процедуру удаления вашей цепочки.
А мы посмотрим  smile 

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


Шустрый
*


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

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



У нулевого звена (адрес которого и хранится в манагере) как и у других звеньев, есть метод delete_chain(). Он будет отвечать за удаление ОТ текущего звена до последнего элемента связи. За срок жизни программы, данная манипуляция будет проводиться 1 раз.
Код

void owner::delete_chain() {
    if (_Right != NULL)
        _Right->delete_chain();
    delete this;
}


Соответственно, при вызове метода удаления динамического объекта, будет вызываться удаление из цепи. Это будет связывание левого и правого элемента и удаление текущего. 
Код

void owner::delete_this() {
    if (_Left != NULL)
        _Left->set_right(_Right);
    if (_Right != NULL)
        _Right->set_left(_Left);
    delete this;
}

Организация подобного в виде массива накладно. Свести в один массив кучу указателей а потом еще и пытаться туда дописать... А такая штуковина не требует индексации, поэтому тут совершенно ненужен  учет количества. Все что смущает, это верность следующего утверждения: одинаково ли удалятся шаблонные объекты, если был вызван метод класса не зависящий от параметров шаблонного класса, который в свою очередь дернул деструктор внутри себя. Если это так, то ... то круто! Более навороченного варианта и не требуется.

Это сообщение отредактировал(а) BearFear - 26.9.2013, 12:06
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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