I filling std::list List. How to do it properly?
When I did this:
objekt * obj = new objekt();
objekt ** objP = &obj;
List.push_back(objP);
or this
objekt * obj = new objekt();
List.push_back(&obj);
it is working. But when I did it inside loop
// Loop 1
for (int i = 0; i < 2000; i++, mi++)
{
if (mi >= 37) mi = 0;
objekt * obj = new objekt(name[mi], i+1);
List.push_back(&obj);
}
it make all pointers inside List point in to last created object. That means, all object ** ObjectPointer point to one objekt * obj. It looks like objekt * obj is created only once and each loop only create new objekt, therefore each item in List point to one adress objekt. I always thinked that objekt inside loop are new object for each round (code above).
Therefore I create new for Pointer to pointer.
// Loop 2
for (int i = 0; i < 2000; i++, mi++)
{
if (mi >= 37) mi = 0;
objekt * o = new objekt(name[mi], i+1);
List.push_back(new objekt*(o));
}
Now each pointer to pointer inside List have unique objekt not same.
This is how I free list
std::list<objekt**>::iterator itL = List.begin();
while (itL != List.end())
{
objekt ** po = *itL;
objekt *& o = *(*itL);
List.erase(itL);
delete o;
delete po;
o = nullptr;
po = nullptr;
itL = List.begin();
}
Questions are
why first loop (Loop 1) is different as second loop (Loop 2) which fill List?
when I insert objekt like this:
objekt * obj = new objekt(); List.push_back(&obj);
should I delete pointer to pointer inside List? (I don't mean object created with new)
objekt ** po = *itL; delete po;