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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как удалить по ссылке из STL контейнера? 
:(
    Опции темы
UnderFelixAbove
Дата 8.9.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.7.2007
Где: г. Астрахань

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



Люди знающие подскажите такой момент. 
Имеется фрагмент:
Код

#include <iostream>
#include <tchar.h>
#include <map>


using namespace std;

struct ST
{
    TCHAR* str;
    ST(){
        str = new TCHAR[39];
    }
    ST(TCHAR* s){
        str = new TCHAR[39];
        _tcscpy(str,s);
    }
};
bool operator < (const ST &a, const ST &b){
    return _tcscmp(a.str,b.str);
}
int main() {
    map<ST,bool> M;
    ST stCur = ST(_T("Строка"));
    M[stCur] = true;
    M.clear();
    return 0;
}


В описании метода clear у map сказано, что он вызывает деструкторы вложенных объектов. Как быть с указателями? (TCHAR*)
Пока приходит на ум только следующее: перед clear пробежаться по всем элементам, запомнить значения TCHAR*, а после clear явно вызвать деструкторы для них.

Есть ли более человечный способ?
PM MAIL ICQ   Вверх
boostcoder
Дата 8.9.2010, 14:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



boost::shared_ptr<>
а вообще, хранить в контейнерах указатели - плохая привычка. другое дело, если контейнер ими не владеет.
PM WWW   Вверх
bsa
Дата 8.9.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(UnderFelixAbove @  8.9.2010,  14:55 Найти цитируемый пост)
Пока приходит на ум только следующее: перед clear пробежаться по всем элементам, запомнить значения TCHAR*, а после clear явно вызвать деструкторы для них.

Есть ли более человечный способ? 
Есть чуть более человечный - пробегая по элементам вызвать delete для каждого, а затем сделать clear. Но самый человечный уже озвучил boostcoder.
PM   Вверх
UnderFelixAbove
Дата 8.9.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.7.2007
Где: г. Астрахань

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



Спасибо!
PM MAIL ICQ   Вверх
borisbn
Дата 8.9.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а ещё можно сделать деструктор в структуре
Код

struct ST
{
    TCHAR* str;
    ST(){
        str = new TCHAR[39];
    }
    ST(TCHAR* s){
        str = new TCHAR[39];
        _tcscpy(str,s);
    }
    ~ST(){
        delete []str;
    }
};

но всё-таки лучше использовать либо shared_ptr, как сказал boostcoder, или пользоваться std::string


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 9.9.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(borisbn @  8.9.2010,  14:40 Найти цитируемый пост)
а ещё можно сделать деструктор в структуре
Можно, но этого недостаточно. Для нормальной хранимости ST в контейнерах ему еще нужны ST::ST(const ST&) и ST::operator =(const ST&)


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


Developer
*


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

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



НА сколько я помню shared_ptr работает с только указателем, получается делает delete, а не delete [].
Вам придется либо организовывать врапер над char * , или как вариант перегрузить new[] и delete [] перенапривив на new delete. Что бы память выделялась и освобождалась единообразно, но наверное это нарушит классическое концепцию С++.
PM MAIL WWW   Вверх
azesmcar
Дата 9.9.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(icecrashldr @  9.9.2010,  11:35 Найти цитируемый пост)
НА сколько я помню shared_ptr работает с только указателем, получается делает delete, а не delete [].
Вам придется либо организовывать врапер над char * , или как вариант перегрузить new[] и delete [] перенапривив на new delete. Что бы память выделялась и освобождалась единообразно, но наверное это нарушит классическое концепцию С++. 

это решение называется обожемой smile 

boost::shared_array
PM   Вверх
icecrashldr
Дата 9.9.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


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

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



azesmcar, Согласен, вот только ваш пример делает конкретизацию на массив ... 
PM MAIL WWW   Вверх
bsa
Дата 9.9.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(icecrashldr @ 9.9.2010,  12:59)
azesmcar, Согласен, вот только ваш пример делает конкретизацию на массив ...

Ты хоть сам-то понимаешь, что пишешь? Тебе предлагают более простое и изящное решение - boost::shared_array. Но тебе не нравится, что он с массивом связан. Если абстрагироваться от подсчета ссылок, то shared_array хранит в себе указатель на память, выделенную (заранее) с помощью new[], а его деструктор вызывает delete[] для этого указателя. Объект share_array можно создавать, уничтожать, копировать и присваивать без боязни утечек памяти - не сложнее, чем любой POD тип (разве что memcpy использовать не стоит для него).

Это сообщение отредактировал(а) bsa - 9.9.2010, 12:49
PM   Вверх
azesmcar
Дата 9.9.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



а вообще-то поскольку речь тут идет об умном указателе на тип TCHAR то может стоит использовать std::string? smile 
PM   Вверх
bsa
Дата 9.9.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(azesmcar @  9.9.2010,  14:18 Найти цитируемый пост)
может стоит использовать std::string?

Реальные пацаны легких путей не ищут.  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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