Класс Vector и оператор new
От: Logic Bomb Россия  
Дата: 14.10.05 20:44
Оценка:
Есть класс
CItem

;

Есть типы:
typedef std::vector <CItem> ItemVector;
typedef std::vector <CItem>::iterator Iter;


Есть вектор и итератор:
ItemVector ItemContainer;
Iter v1_Iter;


Есть функция:
CItem* Func() 
{
        for(int i=0;i<10;i++)
        {
                CItem* current_item = new CItem();
                // не буду вдаваться в подробности, здесь 
                // создается связанный список
                ItemContainer.push_back(*current);
        }

}


Значит ли это, что после того как я запихиваю созданный динамически элемент методом push_back в вектор, после завершения работы функции у меня две одинаковые копии данных в памяти? Надо ли удалять сами элементы, или вектор — и мои указатели — это одни и те-же участки памяти?
Все имена функций и классов изменены, любое совпадение является случайным.
Re: Класс Vector и оператор new
От: Daevaorn Россия  
Дата: 15.10.05 07:25
Оценка:
Здравствуйте, Logic Bomb,

Удаляй обязательно! Твои указатели указываеют совершенно на другую память нежели вектор.
Re: Класс Vector и оператор new
От: GorSI  
Дата: 15.10.05 07:43
Оценка:
Здравствуйте, Logic Bomb,

Встречный вопрос: а стоит ли инстанцировать вектор типом CItem, если используется динамическое создание элементов? К тому же, если в CItem есть элементы CItem* (судя по тому, что создаётся связанный список), то они будут указывать на элементы не в векторе а на "твои элементы".
Re: Класс Vector и оператор new
От: srggal Украина  
Дата: 15.10.05 10:23
Оценка:
Здравствуйте, Logic Bomb, Вы писали:

На самом деле в вектор Вы помещаете сконструированный при помощи контруктора копирования элемент.
Т.е. динамическое создание в Вашем случае не нужно:

for(int i=0;i<10;i++)
        {
                ItemContainer.push_back( CItem() );
        }


Если Вам нужно заполнить вектор элементами созданными конструкторами по умолчанию, то достаточно написать так:

ItemContainer.resize( 10 );


Если надо запонить копиями одного элемента:
CItem        item;
ItemContainer.resize( 10, item );
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Класс Vector и оператор new
От: Logic Bomb Россия  
Дата: 15.10.05 13:36
Оценка:
То-есть получается что использованеи вектора в данном случае — излишество?
Для чего же он тогда полезен?
Все имена функций и классов изменены, любое совпадение является случайным.
Re[3]: Класс Vector и оператор new
От: srggal Украина  
Дата: 15.10.05 13:47
Оценка:
Здравствуйте, Logic Bomb, Вы писали:

LB>То-есть получается что использованеи вектора в данном случае — излишество?


Отчего же излишиство???
Излишество, в приведенном Вами примере — это динамическое распределение CItem с последующей передачей созданного экземпляра, по значению в функцию push_back() вектора.

typedef std::vector <CItem*> ItemVector;


тогда

for(int i=0;i<10;i++)
        {
                CItem* current_item = new CItem();
                // не буду вдаваться в подробности, здесь 
                // создается связанный список
                ItemContainer.push_back(current);
        }


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

LB>Для чего же он тогда полезен?

Контейнеры STL — являются типобезопасными динамическими контейнерами.
Это и является полезным. Но это в кратце, подробности в книгах, которые были порекомендованы в ответах на вопросы типа "Порекомендуйте книгу по СТЛ", на этом форуме.
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.