C++填充指向指针**列表的指针,该列表指向指针地址

C++ fill Pointer to pointer ** list which point to pointer address

本文关键字:指针 列表 地址 C++ 填充      更新时间:2023-10-16

I填充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都指向一个objekt*obj。看起来objekt*obj只创建了一次,每个循环只创建新的objekt,因此List中的每个项都指向一位地址objekt。我一直认为循环中的objekt是每一轮的新对象(上面的代码)。

因此,我为指针到指针创建了新的指针。

// 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. 为什么第一个循环(循环1)与第二个循环(环路2)不同?

  2. 当我插入这样的对象时:

    objekt*obj=新的objekt();List.push_back(&obj)

    我应该删除列表中指向指针的指针吗?(我不是指用新的创建的对象)

    objekt**po=*itL;删除po

您存储的是指向obj的指针,而不是它包含的内容。

因此,在列表中有指向obji指针。

线路:

List.push_back(&obj);

应为:

List.push_back(obj);

我一直认为循环中的objekt是每一轮的新对象(上面的代码)。

你的想法是正确的。

它使List中的所有指针都指向最后创建的对象。

实际上,所有指针(类型为objekt **)都指向已销毁的对象(类型为objekt *)。据说他们在"晃来晃去"。分离悬挂的指针具有未定义的行为。

看起来objekt*obj只创建了一次,每个循环只创建新的objekt

未定义的行为可以看起来像任何东西。

  1. 为什么第一个循环(循环1)与第二个循环(环路2)不同

在第一个循环中,指针是在循环体中声明的自动变量。由于它们有自动存储,变量在作用域的末尾被销毁(在这种情况下是循环体)。因此,向量中的指针是悬空的,并且间接指向它们具有未定义的行为。

在第二个循环中,指针具有动态存储。它们在被删除之前不会被销毁。因此,不存在悬空指针,并且对指针的间接性进行了很好的定义。

  1. 我应该删除列表中指向指针的指针吗?(我不是指用新创建的对象)

必须deletenew返回的所有指针,否则内存将泄漏。您不能delete任何东西否则行为将未定义。

在第二个示例中,*itL是用new创建的,因此必须将其删除。