我填写了std :: list列表。如何正确执行?
当我这样做时:
objekt * obj = new objekt();
objekt ** objP = &obj;
List.push_back(objP);
或这个
objekt * obj = new objekt();
List.push_back(&obj);
正在工作。但是当我在循环内完成
// 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);
}
它使List内的所有指针都指向最后创建的对象。这意味着,所有对象** ObjectPointer都指向一个对象* obj。看起来objekt * obj仅创建一次,并且每个循环仅创建新的objekt,因此List中的每个项目都指向一个地址对象。我一直认为循环内的对象是每一轮的新对象(上面的代码)。
因此,我为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));
}
现在,指向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();
}
问题是
为什么第一个循环(循环1)与填充列表的第二个循环(循环2)不同?
当我插入这样的对象时:
objekt * obj = new objekt(); List.push_back(&obj);
我应该删除List内的指针吗? (我不是说用new创建的对象)
objekt ** po = *itL; delete po;
答案 0 :(得分:0)
您存储的是指向obj
的指针,而不是它所包含的指针。
因此,在列表中,您有i
个指向obj
的指针。
该行:
List.push_back(&obj);
应该是:
List.push_back(obj);
答案 1 :(得分:-1)
我一直认为循环内的对象是每一轮的新对象(上面的代码)。
您的想法正确。
它使列表内的所有指针都指向最后创建的对象。
实际上,所有指针(objekt **
类型)都指向已销毁的对象(objekt *
类型)。据说它们是“悬空的”。间接悬空指针具有不确定的行为。
看起来好像对象* obj仅创建一次,每个循环仅创建新对象
未定义的行为可能看起来像任何东西。
- 为什么第一个循环(循环1)与填充列表的第二个循环(循环2)不同?
在第一个循环中,指针是在循环体内声明的自动变量。由于它们具有自动存储功能,因此变量在作用域的末尾(在本例中为循环体)被销毁。因此,向量中的指针悬空并且间接指向它们具有不确定的行为。
在第二个循环中,您的指针具有动态存储。除非删除它们,否则它们不会被破坏。因此,没有悬空的指针,并且间接定义了指针。
- 我应该删除List内的指针吗? (我不是说用new创建的对象)
您必须delete
返回的所有指针new
所有,否则内存将泄漏。您不得delete
任何事情,否则行为将是不确定的。
在第二个示例的情况下,*itL
是使用new
创建的 ,因此必须将其删除。