с++ vector, iterator, new and delete

23 отговора 0 прегледа
#1

с++ vector, iterator, new and delete

hi
въпросът ми е как се трият елементите на вектор в с++ ако са в хийпа:
(бтв елементите са пойнтери)

vector<Point*> vec;
for( int i=0; i < 10; i++ )
vec.push_back( new Point() );


така вярно ли е ?

vector<Point*>::iterator it;
vector<Point*>::iterator temp_it;
temp_it = vec.erase (it.begin(), it.end());
vec.erase (temp_it);


След като съм извиквал new, не трябва ли после да извикам и delete?

примерно:

vector<Point*>::iterator it;
vector<Point*>::iterator temp_it;
for (it=vec.begin(); it != vec.end(); it++)
{
temp_it = it;
delete (*temp_it);
vec.erase(temp_it);


или е пълна глупост това, което написах?

мерси за отговорите (ако има такива)

Отговор
в отговор на trp #2

Re: с++ vector, iterator, new and delete

След като съм извиквал new, не трябва ли после да извикам и delete?

Ти как мислиш? Вектора от къде да знае ти как си го алокирал тоя обект, че да го освободи? (Оунършип ишус не коментирам изобщо).

Хората, бтв, са измислили boost::shared_ptr за да не се занимават с такива неща.

Отговор
в отговор на gruhal #3

Re: с++ vector, iterator, new and delete

boost библиотеките не са част от stl.. иначе лошо няма.

Отговор
в отговор на headhunter #4

Re: с++ vector, iterator, new and delete

а) това какво общо има с бялата мечка?
б) std::tr1 някой хубав ден

Отговор
в отговор на trp #5

Re: с++ vector, iterator, new and delete

Защо във вектора искаш да слагаш поинтер а не стойност? Ако не искаш да викаш делийт използвай смарт поинтери. Това с двата ерайза дето почиства целия вектор и после се опитва да изтрие итератора върнат от ерайза не разбирам какво искаш да постигнеш. Има clear метод, който ще зачисти вектора. Ако ползваш поинтери ще имаш мемори лийк.
Последното парче код ерайз ти връща итератор, така че не ти е нужен for цикъл, може да се направи по-елегантно с while подобно на второто парче код само че изтриваш само един елелмент и върнатия итератор го проверяваш за енд. Няма нужда от it++.

Отговор
в отговор на trp #6

Re: с++ vector, iterator, new and delete

Както са ти казали може да ползваш shared_ptr от библиотеката bost.
А може да ползваш и това (преди малко го написах и не е много тествано, но има вид да работи):

template <class T>

class PtrShell : public T
{
public:
typedef typename T::value_type value_type;

class DelPtr
{
public:
void operator()(value_type p) const
{
delete p;
}
};

~PtrShell()
{
std::for_each(begin(), end(), DelPtr());
}
};

typedef PtrShell< std::set<int*> > PtrVector;

int _tmain(int argc, _TCHAR* argv[])
{
PtrVector v;

v.insert(new int(5));
v.insert(new int(7));
return 0;
}


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #7

Re: с++ vector, iterator, new and delete

мерси за отговорите.
ползвам пойнтери, защото имам полиморфизъм. други библиотеки или специални класове не искам да ползвам, защото има вече много написан код и ще е по-лесно просто да направя това правилно с нормалните пойнтери, все пак не е невъзможно.

ето какво искам да направя, в случай че имам вектор от пойнтери:

for (int i=0; i<vec.size(); i++)
delete vec[ i ];

vec.clear();


т.е. не ми трябват специални библиотеки и класове и паметта, заета от елементите, сочени от пойнтерите, се освобождава, нали така.

въпросът ми е как същата цел да я постигна, когато имам лист от пойнтери?
тогава вече ми трябва итератор, или?

та, за лист предполагам, че трябва да направя:

list<Point*>::iterator it;

for (it=myList.begin(); it != myList.end(); it++)
{
delete (*it);
it = myList.erase(it);
}

myList.clear(); //тва дали ми трябва, след като съм викал erase() вече?


Отговор
в отговор на trp #8

Re: с++ vector, iterator, new and delete

В последния цикъл итератора се увеличава веднъж с ++ и веднъж след erase. Това означава че ще изтриваш елементите през един. Да не говориме че е вероятно това да стане безкраен цикъл.
Или използвай while или не присвочвай итератора на erase-a на it.
И онова не ти трябва след като си викал erase.
Ако ползваш итератор за вектора можеш да изтриеш елементите докато обикаляш така или иначе се въртиш да ги делийтваш, можеш и да ги ерейзнеш.

Отговор
в отговор на gruhal #9

Re: с++ vector, iterator, new and delete

Като стана дума за бялата мечка, те ви един виц:

-Загадывай третье желание
-Хочу то, чего никогда не пробовала
-Вот тебе гавно белого медведя
-Ой! Прямо как "Орбит чёрная смородина"

Отговор
в отговор на Colombino #10

Re: с++ vector, iterator, new and delete

Коломбино не спазваш златното правило никога да не наследяваш класове без виртуален деструктор.

Отговор
в отговор на фъk #11

Re: с++ vector, iterator, new and delete

Няма абсолютни правила. Често се налага да избереш по-малкото зло. По-добре ли е да оставиш триенето на принципа 'ако се сета ша ги затрия'?

Ако не инстанциираш с new и да държиш нещата в контейнер с базови типове от където да ги триеш с delete нема как да се преебеш. А това се прави когато се имплементира общ интерфейс. Дай ся да не си правим удобства, че STL-а нема виртуални деструктори. Който го е страх от мечки да не ходи в гората.

В интерес на истината аз съм правил нещо подобно с неучебна цел и тогава се предпазих от нещо далеч по-опасно което не си забелязал - копирането. Щот нали се сещаш кво мазало ша стане ако некой изкопира контейнера?..

А ти, между другото, не спазваш правилото, че след обръщение се пише запетая.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #12

Re: с++ vector, iterator, new and delete

Прав си (почти) няма абсолютни правила. Едно обаче абсолютно правило е да не се наследяват класове с публичен не-виртуален деструктор. Удобствата със СТЛ се правят с помощта на containment а не наследяване. Да ти кажа аз като видя клас с генерален проблем като този не се занимавам да му обръщам повече внимание. Пък и по твоята логика на заобикаляне на разни неудобства мога да реша да го копирам през допълнителна функция направена специално за целта. Щото как беше, който го е страх от мечки да не ходи в гората .

Отговор
в отговор на Colombino #13

Re: с++ vector, iterator, new and delete

Много лесно се връзваш, бе Colombino

В отговор на:

А ти, между другото, не спазваш правилото, че след обръщение се пише запетая.




То тва запетаите са сложна работа - искат да се врат къде ли не - след фрази с "ако", около вметнати изрази, преди "когато", "който" или около подчинени изречения...

Важното е да не им се даваш без бой, нъл тъй:

В отговор на:

По-добре ли е да оставиш триенето на принципа 'ако се сета, ша ги затрия'?

Ако не инстанциираш с new и да държиш нещата в контейнер с базови типове, от където да ги триеш с delete, нема как да се преебеш. А това се прави, когато се имплементира общ интерфейс. Дай ся да не си правим удобства, че STL-ът нема виртуални деструктори. Който го е страх от мечки, да не ходи в гората.

В отговор на:



Отговор
в отговор на eee #14

Re: с++ vector, iterator, new and delete

Едни правила са по-сложни от други. Аз не се заяждам за по-сложните, а само за най-очевидните.

Примерно за кратък/пълен член не се заяждам, макар че сравнително рядко ги бъркам и то просто защото не внимавам, не че не знам кво е подлог.

Тая запетая пред 'от където' я видях, ма ме домързя да я редактирам, макар да знаех че когато правя забележка за синтаксис ще се заядат с мен. Пълният член не го бях видял. Допусках, че има и други дребни бъгове. М/у другото пред 'да' няма запетая, бъркаш се.

Не приемам елементарни грешки от типа на 'ий' вместо 'ии', примерно. Запетаята след обръщение е една от тях. В повечето случаи не се заяждам, де, ма сичко си е до настроение.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #15

Re: с++ vector, iterator, new and delete

В отговор на:

Пълния член не го бях видял. Допусках, че има и други дребни бъгове. М/у другото, пред 'да' няма запетая, бъркаш се.




Вероятно:

[линк]

"Свързване със запетая" - първото правило (и пример)

В отговор на:

Едни правила са по-сложни от други. Аз не се заяждам за по-сложните, а само за най-очевидните.




Споко, всички сме така - нормално е да се заяждаме само за правилата, които знаем, но другарчетата не знаят. За тия, които не знаем, просто няма как да се заяждаме. (Re виртуални деструктори и други такива гяволи...)

Отговор
в отговор на мдa #16

Re: с++ vector, iterator, new and delete

Ми не, просто вярвам че има градация на грешките. И за дребните не се заяждам. Верно пак съм объркал размера на члена. Човек требе да внимава повече като води езикови спорове. А некои от запетайките умишлено ги изпускам - струва ми се че правилата са малко прекалени. В английския е по-споко, май. Както и да е, аз ща продължа да се заяждам за 'ий', примерно, щото е дебилно. Пък ти ако искаш ме проверявай мен за грешки.

Кое те кара да мислиш, че не знам какво е виртуален деструктор и къде се прилага!? Просто контайнването е по-трудоемко от наследяването. Иначе в STL има доста примери как се прави - виж примерно разните стекове, декове и т.н. рестрикции върху контейнер.

System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #17

Re: с++ vector, iterator, new and delete

В отговор на:

Кое те кара да мислиш, че не знам какво е виртуален деструктор и къде се прилага!?




Ааа, нищо. Просто лесно се връзваш и е забавно да ти пали фитила човек.

Те виртуалните деструктори са малко като запетайките - прекалено строга работа ми се чинят (пък и както казваш - трудна), мисля да пиша на Скот по въпроса.

Отговор
в отговор на Colombino #18

Re: с++ vector, iterator, new and delete

В отговор на:

В английския е по-споко, май.



(Eй тука вече ти разрешавам да я изпуснеш запетаята...)

[линк]

По-споко е, стига да не си много грамотен.

Отговор
в отговор на фъk #19

Re: с++ vector, iterator, new and delete

То това да беше само проблема, с мед да го намажеш

Отговор
в отговор на Colombino #20

Re: с++ vector, iterator, new and delete

"Ако не инстанциираш с new и да държиш нещата в контейнер с базови типове от където да ги триеш с delete нема как да се преебеш. А това се прави когато се имплементира общ интерфейс."

Ебаси майката, навремето мислех, че С++ е симпатичен език :)

Отговор