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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в перегруженный оператор delete, передать размер класса 
V
    Опции темы
georain
Дата 29.1.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот хочу создать базовый класс с перегруженными new и delete, всё отлично, только вот мне нужно в операторе delete знать размер удаляемого класса, чтобы передать менеджеру памяти (его суть как раз что он его не запоминает). Т.е. если удаляется производный класс то нужен соответственно размер производного класса. Вот такая реализация не компилится:

Код

class BasicContainer{
public:
    BasicContainer(){};
    virtual ~BasicContainer(){};

    void * operator new(size_t size){
        return const_cast<void *>(ContainerOperatorObject.new_container(size));
    };
    void operator delete(void * pointer){
        ContainerOperatorObject.delete_container(pointer, mysize());
    };

    //возвращает размер класса
    virtual size_t mysize(){sizeof(*this);};
};


ругаясь на строчку
Код

ContainerOperatorObject.delete_container(pointer, mysize());

а конкретно на mysize() : a nonstatic member reference must be relative to a specific object.

Во-первых я не понимаю что ему надо, а во-вторых такая реализация не блещет изяществом smile
В каждом производном классе придётся вставлять

Код

//возвращает размер класса
    virtual size_t mysize(){sizeof(*this);};


что не весело. Может кто подскажет как это по человечески сделать?
PM MAIL   Вверх
JackYF
Дата 29.1.2008, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(georain @  29.1.2008,  21:05 Найти цитируемый пост)
только вот мне нужно в операторе delete знать размер удаляемого класса, чтобы передать менеджеру памяти (его суть как раз что он его не запоминает)

Все известные мне менеджеры памяти сами знают размер удаляемого куска памяти. Иначе с полиморфизмом придётся туго.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
georain
Дата 29.1.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(georain @  29.1.2008,  22:05 Найти цитируемый пост)
его суть как раз что он его не запоминает
 (его - размер)
В этом и фишка, т.е. что никак чтоли? Если рассуждать логически, то все известные нам даны уже на этапе компиляции, нужно только их правильно использовать.
Почему же моя реализация не работает?

добавлено:
Я тут покопался, оказывается operator delete - статическая функция :( и что делать?

Это сообщение отредактировал(а) georain - 29.1.2008, 22:24
PM MAIL   Вверх
MAKCim
Дата 29.1.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



georain
Цитата(georain @  29.1.2008,  22:05 Найти цитируемый пост)
его суть как раз что он его не запоминает

плохо
что мешает сделать так
Код

void * operator new(size_t size){
        int * address = static_cast<int*>(const_cast<void *>(ContainerOperatorObject.new_container(size + sizeof(int))));
        *address = size;
        return address + 1;
};




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

PM MAIL   Вверх
georain
Дата 29.1.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Это не подходит. Тут фишка в экономии памяти.
Ведь смотрите, если уж мы в каждом классе всё равно имеем издержки на указатель к виртуальной таблице, так почему бы нам не хранить размер каждого класса только в одном экземпляре. И при удалении по заданному адресу получать из этого же адреса и размер области (размер класса) через виртуальную функцию.
Пока писал понял как реализовать smile. Вроде... как всегда

Это сообщение отредактировал(а) georain - 31.1.2008, 03:14
PM MAIL   Вверх
georain
Дата 30.1.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я изменил интерфейс менеджера на
Код

    void operator delete(void * pointer){
        ContainerOperatorObject.delete_container(pointer);
    };

т.е. теперь он принимает только указатель, т.е.  operator delete остаётся статическим, а для определения размера я вызываю
Код

    size = ((BasicContainer *) pointer)->mysize();

уже изнутри менеджера.

Вуоля, пока на форуме не расписал всё, ничего понять не мог, что происходит.

Только теперь остаётся ещё одна интересная задачка:
в каждом наследуемом классе придётся писать функцию
Код

//возвращает размер класса
    virtual size_t mysize(){sizeof(*this);};

можно ли это обойти? ;)

Это сообщение отредактировал(а) georain - 30.1.2008, 00:05
PM MAIL   Вверх
JackYF
Дата 30.1.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(georain @  29.1.2008,  23:04 Найти цитируемый пост)
 virtual size_t mysize(){sizeof(*this);};

зачем? не вижу необходимости


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
georain
Дата 30.1.2008, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(JackYF @  30.1.2008,  00:07 Найти цитируемый пост)
зачем? не вижу необходимости 

эээ... поясни пожалуйста  

или ты имеешь ввиду что и так нормально.
На самом деле да, это небольшие затраты, но ведь это повторение кода.
Абсолютно одинакового кода, неужели нет способов этого избежать (кроме #define smile).

Это сообщение отредактировал(а) georain - 30.1.2008, 00:39
PM MAIL   Вверх
Lazin
Дата 30.1.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



georain, сделай деструктор виртуальным, и ты сможешь получать размер оператором sizeof, ф-я mysize будет ненужна
PM MAIL Skype GTalk   Вверх
Alek86
Дата 30.1.2008, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(georain @  30.1.2008,  00:04 Найти цитируемый пост)
в каждом наследуемом классе придётся писать функцию


придется, а что поделать? :(
при агрегации тоже часто куча копипаста


--------------------
user posted image    user posted image
PM MAIL   Вверх
JackYF
Дата 30.1.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Блин, ещё раз. Вы в памяти при создании объекта храните количество байт в этом объекте. Этот же размер использует delete, когда ему нужно удалить память. На фига вам mysize(), объясните мне?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 30.1.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Извините, что вклиниваюсь в вашу увлекательную беседу на тему "как сделать так, чтобы враг не догадался" smile, но, если изначальный вопрос ещё актуален, то ответ такой: добавить параметр типа size_t.
Код

struct A
{
    static void operator delete(void * pointer, size_t sz)
    { /* ... */ }

    static void operator delete [](void * pointer, size_t sz)
    { /* ... */ }
// ...
};


Это сообщение отредактировал(а) archimed7592 - 30.1.2008, 17:39


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
chipset
Дата 30.1.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



А нельзя delete на шаблонах сделать? Щаз компилера под руками нет.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
archimed7592
Дата 31.1.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(chipset @  30.1.2008,  20:15 Найти цитируемый пост)
А нельзя delete на шаблонах сделать? Щаз компилера под руками нет. 

Если ты про operator delete, то можно, но толку от такого оператора будет немного, ибо вызывать можно будет только явно.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
georain
Дата 31.1.2008, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(JackYF @  30.1.2008,  15:13 Найти цитируемый пост)
На фига вам mysize(), объясните мне? 

Ответ прост: нам не нужно в каждом объекте хранить ещё одно поле, размер мы получаем статически.
(гигибайты оперативки медленно но верно делают свою дело smile)

Цитата(Lazin @  30.1.2008,  09:26 Найти цитируемый пост)
georain, сделай деструктор виртуальным, и ты сможешь получать размер оператором sizeof, ф-я mysize будет ненужна 

 smile 

Цитата(archimed7592 @  30.1.2008,  17:38 Найти цитируемый пост)
добавить параметр типа size_t.
Код

static void operator delete(void * pointer, size_t sz);


А вот и ответ на вопрос "Как в перегруженный оператор delete добавить размер класса"
Спасибо!

Это сообщение отредактировал(а) georain - 31.1.2008, 02:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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