с++ vector, iterator, new and delete
с++ vector, iterator, new and delete
въпросът ми е как се трият елементите на вектор в с++ ако са в хийпа:
(бтв елементите са пойнтери)
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);
или е пълна глупост това, което написах?
мерси за отговорите (ако има такива)
Re: с++ vector, iterator, new and delete
Ти как мислиш? Вектора от къде да знае ти как си го алокирал тоя обект, че да го освободи? (Оунършип ишус не коментирам изобщо).
Хората, бтв, са измислили boost::shared_ptr за да не се занимават с такива неща.
Re: с++ vector, iterator, new and delete
Re: с++ vector, iterator, new and delete
б) std::tr1 някой хубав ден
Re: с++ vector, iterator, new and delete
Последното парче код ерайз ти връща итератор, така че не ти е нужен for цикъл, може да се направи по-елегантно с while подобно на второто парче код само че изтриваш само един елелмент и върнатия итератор го проверяваш за енд. Няма нужда от it++.
Re: с++ vector, iterator, new and delete
А може да ползваш и това (преди малко го написах и не е много тествано, но има вид да работи):
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?_
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() вече?
Re: с++ vector, iterator, new and delete
Или използвай while или не присвочвай итератора на erase-a на it.
И онова не ти трябва след като си викал erase.
Ако ползваш итератор за вектора можеш да изтриеш елементите докато обикаляш така или иначе се въртиш да ги делийтваш, можеш и да ги ерейзнеш.
Re: с++ vector, iterator, new and delete
-Загадывай третье желание
-Хочу то, чего никогда не пробовала
-Вот тебе гавно белого медведя
-Ой! Прямо как "Орбит чёрная смородина"
Re: с++ vector, iterator, new and delete
Re: с++ vector, iterator, new and delete
Ако не инстанциираш с new и да държиш нещата в контейнер с базови типове от където да ги триеш с delete нема как да се преебеш. А това се прави когато се имплементира общ интерфейс. Дай ся да не си правим удобства, че STL-а нема виртуални деструктори. Който го е страх от мечки да не ходи в гората.
В интерес на истината аз съм правил нещо подобно с неучебна цел и тогава се предпазих от нещо далеч по-опасно което не си забелязал - копирането. Щот нали се сещаш кво мазало ша стане ако некой изкопира контейнера?..
А ти, между другото, не спазваш правилото, че след обръщение се пише запетая.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: с++ vector, iterator, new and delete
Re: с++ vector, iterator, new and delete
В отговор на:А ти, между другото, не спазваш правилото, че след обръщение се пише запетая.
То тва запетаите са сложна работа - искат да се врат къде ли не - след фрази с "ако", около вметнати изрази, преди "когато", "който" или около подчинени изречения...
Важното е да не им се даваш без бой, нъл тъй:
В отговор на:По-добре ли е да оставиш триенето на принципа 'ако се сета, ша ги затрия'?
Ако не инстанциираш с new и да държиш нещата в контейнер с базови типове, от където да ги триеш с delete, нема как да се преебеш. А това се прави, когато се имплементира общ интерфейс. Дай ся да не си правим удобства, че STL-ът нема виртуални деструктори. Който го е страх от мечки, да не ходи в гората.В отговор на:
Re: с++ vector, iterator, new and delete
Примерно за кратък/пълен член не се заяждам, макар че сравнително рядко ги бъркам и то просто защото не внимавам, не че не знам кво е подлог.
Тая запетая пред 'от където' я видях, ма ме домързя да я редактирам, макар да знаех че когато правя забележка за синтаксис ще се заядат с мен. Пълният член не го бях видял. Допусках, че има и други дребни бъгове. М/у другото пред 'да' няма запетая, бъркаш се.
Не приемам елементарни грешки от типа на 'ий' вместо 'ии', примерно. Запетаята след обръщение е една от тях. В повечето случаи не се заяждам, де, ма сичко си е до настроение.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: с++ vector, iterator, new and delete
В отговор на:Пълния член не го бях видял. Допусках, че има и други дребни бъгове. М/у другото, пред 'да' няма запетая, бъркаш се.
Вероятно:
[линк]
"Свързване със запетая" - първото правило (и пример)
В отговор на:Едни правила са по-сложни от други. Аз не се заяждам за по-сложните, а само за най-очевидните.
Споко, всички сме така - нормално е да се заяждаме само за правилата, които знаем, но другарчетата не знаят. За тия, които не знаем, просто няма как да се заяждаме. (Re виртуални деструктори и други такива гяволи...)
Re: с++ vector, iterator, new and delete
Кое те кара да мислиш, че не знам какво е виртуален деструктор и къде се прилага!? Просто контайнването е по-трудоемко от наследяването. Иначе в STL има доста примери как се прави - виж примерно разните стекове, декове и т.н. рестрикции върху контейнер.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: с++ vector, iterator, new and delete
В отговор на:Кое те кара да мислиш, че не знам какво е виртуален деструктор и къде се прилага!?
Ааа, нищо. Просто лесно се връзваш и е забавно да ти пали фитила човек.
Те виртуалните деструктори са малко като запетайките - прекалено строга работа ми се чинят (пък и както казваш - трудна), мисля да пиша на Скот по въпроса.
Re: с++ vector, iterator, new and delete
В отговор на:В английския е по-споко, май.
(Eй тука вече ти разрешавам да я изпуснеш запетаята...)
[линк]
По-споко е, стига да не си много грамотен.
Re: с++ vector, iterator, new and delete
Re: с++ vector, iterator, new and delete
Ебаси майката, навремето мислех, че С++ е симпатичен език :)