首页 > 解决方案 > 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 内的所有指针都指向最后创建的对象。也就是说,所有的object ** 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 内指针的指针都有唯一的 objekt 不一样。

这就是我免费列表的方式

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 时:

    对象 * 对象 = 新对象();
    List.push_back(&obj);

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

    对象 ** po = *itL;
    删除宝;

标签: c++

解决方案


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

所以在列表中你有i指向obj.

该行:

List.push_back(&obj);

应该 :

List.push_back(obj);

推荐阅读