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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура и поэлементное удаление 
V
    Опции темы
SABROG
  Дата 30.12.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Предположим, что есть структура типа 

Код

struct MyStruct
{
    mytype *country,
    *book,
    *author,
    *pages,
    *language,
    ... и т.д. элементов 20 или более
    int item;
    double number;
};


Так вот как в цикле удалить указатели из этой структуры, чтобы освободить память, при этом, чтобы оставить возможность обращаться к этим указателям по имени и не городить башню типа:

Код

delete i.country;
delete i.book;
delete i.author;
...


Плюс с точки зрения безопасности. Я ведь могу добавить итем в структуру и забыть прописать его удаление.

Я знаю одно решение, которое использует адресную арифметику и увеличивает указатель на начало первого указателя до тех пор, пока адрес не станет больше указателя на последний элемент. Но имхо это не правильно.

Использовать всякие hashmap'ы я не хочу. Может просто в структуре объявить массив указателей, а в отдельной структуре описать имена каждого элемента. Когда нужен поименный доступ буду "кастовать" этот массив в структуру, когда нужно удаление - буду пробегаться по массив. 


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mrbrooks
Дата 30.12.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Может просто использовать конструктор-деструктор.
PM MAIL   Вверх
GoldFinch
Дата 30.12.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



или писать на ЯП с автоматическим сбором мусора
PM MAIL ICQ   Вверх
SABROG
Дата 30.12.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mrbrooks @  30.12.2008,  10:21 Найти цитируемый пост)
Может просто использовать конструктор-деструктор. 


А смысл, если в том же деструкторе придется прописывать многоэтажное удаление ?

Цитата(GoldFinch @  30.12.2008,  11:19 Найти цитируемый пост)
или писать на ЯП с автоматическим сбором мусора 


Намек на Java понят, но что если проекту уже несколько лет и он на C++ smile ? (проекта нет на самом деле, это гипотетически)


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
pan2004
Дата 30.12.2008, 11:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А использовать умные указатели? Да тот же shared_ptr<> освободит от необходимости писать кучу delete.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
SABROG
Дата 30.12.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(pan2004 @  30.12.2008,  11:49 Найти цитируемый пост)
А использовать умные указатели? Да тот же shared_ptr<> освободит от необходимости писать кучу delete. 


А его можно использовать с библиотеками, которые не знают о существовании умных указателей ? Например у метода чужого класса параметр mytype * и больше никакой ? Если я получу указатель через get() и передам его в метод. Метод его поюзает и вернет управление. Все, теперь мне надо удалить указатель. Не удалится же он сам ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
pan2004
Дата 30.12.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SABROG @  30.12.2008,  12:15 Найти цитируемый пост)
А его можно использовать с библиотеками, которые не знают о существовании умных указателей

Можно, главное чтобы эти библиотеки не брали на себя шефство над этими указателями, те например не пытались их удалять.

Цитата(SABROG @  30.12.2008,  12:15 Найти цитируемый пост)
Например у метода чужого класса параметр mytype * и больше никакой ? Если я получу указатель через get() и передам его в метод. Метод его поюзает и вернет управление.

Это безопасно, если метод не пытается сохранить этот указатель где то у себя внутри, тогда надо следить, чтобы время жизни такого "неуправляемого" указателя было не больше чем у shared.

Цитата(SABROG @  30.12.2008,  12:15 Найти цитируемый пост)
Все, теперь мне надо удалить указатель. Не удалится же он сам ?

shared_ptr<> удалит объект на который он указывает сам, как только запустится деструктор последнего shared_ptr, указывающего на этот объект.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
mes
Дата 30.12.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  30.12.2008,  11:35 Найти цитируемый пост)
А смысл, если в том же деструкторе придется прописывать многоэтажное удаление ?

В деструкторе прописывается один раз, а если удалять в коде программы, то при изменении структуры надо будет найти все места, где происходило удаление.

Пример какой то надуманный.. Чего от Вы не договариваете.. 

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



--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.12.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(pan2004 @  30.12.2008,  12:24 Найти цитируемый пост)
Это безопасно, если метод не пытается сохранить этот указатель где то у себя внутри, тогда надо следить, чтобы время жизни такого "неуправляемого" указателя было не больше чем у shared.

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

Цитата(mes @  30.12.2008,  12:39 Найти цитируемый пост)
В деструкторе прописывается один раз, а если удалять в коде программы, то при изменении структуры надо будет найти все места, где происходило удаление.

В принципе очистка и так в деструкторе идет, но в стороннем классе, который использует эти структуры. Место хоть и одно, но с  точки зрения оптимизации 20 инструкций delete идущих подряд в бинарнике, вместо цикла с адресной арифметикой, не очень нравится.

Цитата(mes @  30.12.2008,  12:39 Найти цитируемый пост)
Пример какой то надуманный.. Чего от Вы не договариваете.. 

Просто сегодня увидел код, где в цикле удалялись элементы структуры с инкриментированием указателя на эту структуру. И вспомнил, что действительно бывают часто такие ситуации при написании GUI приложений, когда надо инициализировать кучу итемов и у каждого свое имя.

Цитата(mes @  30.12.2008,  12:39 Найти цитируемый пост)
Также не понятно:
  являются ли объекты "собственностью " указателей ?
  если да, то почему выбрано хранение объекта в структуре по указателю, а не по значению ?
  какая логика должна быть при копировании структуры ?

Нет, объекты - классы сторонней библиотеки, чья реализация завуалирована и не поддается редактированию smile
Структуры просто помещаются в массив. Предположим, каждая структура - родитель в treeview, а указатели этой структуры - детки.

Все-таки давайте не отклонятся от первоначальной темы в сторону перепроектирования приложения. Проекта нет и ситуация чисто гипотетическая.

Это сообщение отредактировал(а) SABROG - 30.12.2008, 13:20


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  30.12.2008,  13:16 Найти цитируемый пост)
. Место хоть и одно, но с  точки зрения оптимизации 20 инструкций delete идущих подряд в бинарнике, вместо цикла с адресной арифметикой, не очень нравится.

ИМХО, лучше  смотреть с точки зрения логичности и подерживаемости кода.

Цитата(SABROG @  30.12.2008,  13:16 Найти цитируемый пост)

Нет, объекты - классы сторонней библиотеки, чья реализация завуалирована и не поддается редактированию smile

А при чем тут реализация объектов ?

Вобщем хоть и не понял что Вам надо, вот попытаюсь для начала условный набросок дать:

Код

   enum ENum { eCountry, eBook, eAuthor, ePages, eLanguage, eDummy };

class MyClass
{
    mytype * m_data[eDummy]; // наши данные 
                                                 //  насколько я понял из вашего объяснения, Вам сама структура как таковая и не нужна,
                                                 //  в таком случае m_data заменяет ее.

 public:

   mytype * ByNum (int num)  { return  m_data[num]; }  // обращение по индексу

   mytype * Country () { return m_data[eCountry]; } // прокси функция для доступа к элементу
   mytype * Book ()    { return m_data[eBook]; }      //  с точки зрения оптимизации :) нагрузки в релизе не будет 

};





Это сообщение отредактировал(а) mes - 30.12.2008, 13:41


--------------------
PM MAIL WWW   Вверх
SABROG
Дата 30.12.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Вот о чем я говорю. Метод с enum отбросил из-за некоторой кривизны доступа к именам объектов, хотя в виде класса смотрится неплохо.

Код

#include <iostream>

struct itest
{
    int *item1,
        *item2,
        *item3,
        *item4,
        *item5;
};

struct stest
{
    int *items[sizeof(itest)/sizeof(int *)];
    double dnumber;
    unsigned char c;
};


int main(int argc, char *argv[])
{
    stest tst;
    itest &itst = reinterpret_cast<itest &>(tst.items);
    itst.item1 = new int(1);
    itst.item2 = new int(2);
    itst.item3 = new int(3);
    itst.item4 = new int(4);
    itst.item5 = new int(5);

    for (int i=0; i < sizeof(itest)/sizeof(int *); i++)
    {
        std::cout << *tst.items[i] << std::endl;
        delete tst.items[i];
    }
    return 0;
}



Т.е. тут достаточно менять список итемов в структуре-интерфейсе. Об остальном программа заботится сама.

Это сообщение отредактировал(а) SABROG - 30.12.2008, 13:55


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  30.12.2008,  13:48 Найти цитируемый пост)
Т.е. тут достаточно менять список итемов в структуре-интерфейсе. Об остальном программа заботится сама.

Удачи и будем надеяться, что "крах " не коснется Вашей конструкции.  smile 


--------------------
PM MAIL WWW   Вверх
bsa
Дата 30.12.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



 smile 
Если бы это написал мой подчиненны, я бы заставил переписывать...
И вообще, с некоторых пор для этих целей использую std::auto_ptr. И стараюсь не юзать его с new вне классов...
PM   Вверх
SABROG
Дата 30.12.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(mes @  30.12.2008,  15:56 Найти цитируемый пост)
Удачи и будем надеяться, что "крах " не коснется Вашей конструкции. 


В каком месте smile ? Всякое конечно может быть. Особенно, если компилятору вздумается размещать данные не по порядку.

Цитата(bsa @  30.12.2008,  16:05 Найти цитируемый пост)
Если бы это написал мой подчиненны, я бы заставил переписывать...
И вообще, с некоторых пор для этих целей использую std::auto_ptr. И стараюсь не юзать его с new вне классов... 

А что именно не нравится, сама задача или то как я реализовал и у тебя есть третий вариант ее решения smile ? Или ты имеешь ввиду, что не замарачивался бы вообще с этим и прописывал все ручками ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 30.12.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(SABROG @  30.12.2008,  16:49 Найти цитируемый пост)
В каком месте smile ? Всякое конечно может быть. 

Цитата(SABROG @  30.12.2008,  13:48 Найти цитируемый пост)
    int *items[sizeof(itest)/sizeof(int *)];

 Вы не учитываете выравнивание...(хотя Вам повезет, так как размер указателя на обычных архитектурах  "попадает на границу выравнивания".)

Цитата(SABROG @  30.12.2008,  16:49 Найти цитируемый пост)
Особенно, если компилятору вздумается размещать данные не по порядку.

А вот этого не вздумается. )

Цитата(SABROG @  30.12.2008,  16:49 Найти цитируемый пост)
А что именно не нравится, сама задача или то как я реализовал и

Цитата(SABROG @  30.12.2008,  13:48 Найти цитируемый пост)
   itest &itst = reinterpret_cast<itest &>(tst.items);

Хотя бы то, что способ использования определен "далеко" от декларации.

Это сообщение отредактировал(а) mes - 30.12.2008, 18:48


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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