C ++ fill指向指针**的指针列表,指向指针地址

时间:2019-01-07 16:19:43

标签: c++

我填写了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. 为什么第一个循环(循环1)与填充列表的第二个循环(循环2)不同?

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

    objekt * obj = new objekt();
    List.push_back(&obj);

    我应该删除List内的指针吗? (我不是说用new创建的对象)

    objekt ** po = *itL;
    delete po;

2 个答案:

答案 0 :(得分:0)

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

因此,在列表中,您有i个指向obj的指针。

该行:

List.push_back(&obj);

应该是:

List.push_back(obj);

答案 1 :(得分:-1)

  

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

您的想法正确。

  

它使列表内的所有指针都指向最后创建的对象。

实际上,所有指针(objekt **类型)都指向已销毁的对象(objekt *类型)。据说它们是“悬空的”。间接悬空指针具有不确定的行为。

  

看起来好像对象* obj仅创建一次,每个循环仅创建新对象

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

  
      
  1. 为什么第一个循环(循环1)与填充列表的第二个循环(循环2)不同?
  2.   

在第一个循环中,指针是在循环体内声明的自动变量。由于它们具有自动存储功能,因此变量在作用域的末尾(在本例中为循环体)被销毁。因此,向量中的指针悬空并且间接指向它们具有不确定的行为。

在第二个循环中,您的指针具有动态存储。除非删除它们,否则它们不会被破坏。因此,没有悬空的指针,并且间接定义了指针。

  
      
  1. 我应该删除List内的指针吗? (我不是说用new创建的对象)
  2.   

您必须delete返回的所有指针new 所有,否则内存将泄漏。您不得delete 任何事情,否则行为将是不确定的。

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