C++中的双指针向量

Posted

技术标签:

【中文标题】C++中的双指针向量【英文标题】:Double pointers vector in c++ 【发布时间】:2019-11-19 12:20:40 【问题描述】:

每个人。我正在做我的家庭任务,并在 c++ 中遇到了一些与向量有关的令人困惑的东西。我有一个双指针向量,我正在循环填充它。问题是每次迭代向量的所有成员的值都会以某种方式发生变化。



我不明白为什么会发生我做错了什么以及应该如何以正确的方式完成。这部分代码正在发生这种情况:

std::queue<TreeNode*> vertexQueue;
std::vector<TreeNode**> vertexVector;
TreeNode* tmp;
vertexQueue.push(Tree);

while (!vertexQueue.empty()) 
    tmp = vertexQueue.front();
    vertexQueue.pop();
    vertexVector.emplace_back(&tmp);

    //this loop is for the output
    for (int i = 0; i < vertexVector.size(); i++) 
        std::cout << (*vertexVector[i])->info.weigth << ' ';
    
    std::cout << std::endl;

    if (!isLeave(tmp)) 
        vertexQueue.push(tmp->leftBranch);
        vertexQueue.push(tmp->rigthBranch);
    

【问题讨论】:

提示:tmp (&amp;tmp) 的位置会改变吗? 这里不需要双指针。 实际上,您正在泄漏内存。您分配一个指向tmp 的指针,然后将指向tmp 本身的指针添加到向量中(所有这些指针都将指向同一个指针tmp!!!),然后重新分配tmp。向量中的所有指针都会看到更新后的tmp,而之前tmp 指向的对象在必杀技中丢失了(除非你在某处还有备份)... 节点总是会有两个孩子还是没有?如果他们只能拥有一个,那么请考虑使用if(left) push(left); if(right) push(right); @Aconcagua 由于没有原始动态分配,这怎么可能导致内存泄漏? 【参考方案1】:

指针 tmpwhile 循环之外声明。

vertexVector.emplace_back(&amp;tmp) 中,您将包含tmp 地址的指针添加到始终相同的向量中。在每次迭代中,您只更改 tmp 的值,这会导致在先前分配给 tmp 的指针下打印值。

【讨论】:

是的,我明白这一点,但正确的做法是什么?制作tmp 双指针并在while 循环中声明? @GlebBessudnov 正确的方法是在向量​​中有单个指针并将tmp 复制到每次新的时间。请注意,在这方面,指针与整数没有什么不同:std::vector&lt;int&gt; v; int n = 10; v.push_back(n); n = 12; v.push_back(n); – 现在向量中有两个独立的 副本 n,每个都有 n 的值添加到向量中。指针都一样。 您发布的代码没有显示任何需要使用双指针向量。正如@Aconcagua 所说,向量中的单个指针就可以完成这项工作。【参考方案2】:

我想了解为什么双指针向量在我的程序中以这种方式工作。

然后在纸上画画:

vector: [pointer]  [pointer]  [pointer]
            |          |          |
             --------  |  --------
                     | | |
                     V V V
                    [ tmp ]
                       |
                       |
                       V
                  <tree node>

现在如果你改变 tmp 的值会发生什么?

vector: [pointer]  [pointer]  [pointer]
            |          |          |
             --------  |  --------
                     | | |
                     V V V
                    [ tmp ]
                       |
                        ------------
                                    |
                                    V
                 <tree node>  <another node>

正确的解决方案不是使用双指针,而是使用单指针:

vector:           [pointer]
         (copies) /   |
            [ tmp ]   |
               |      |
               -----  |
                    | |
                    V V
              <tree node>

然后一步:

vector:           [pointer]        [pointer]
                      |   (copies) / |
                      |     [ tmp ]  |
                      |        |     |
                      |        ----  |
                      |            | |
                      V            V V
              <tree node>     <another node>

【讨论】:

以上是关于C++中的双指针向量的主要内容,如果未能解决你的问题,请参考以下文章

链表中的双指针

数组中的双指针

c中结构指针内的双数组

具有数据结构的双指针的算术

如何使用 C++ 中的指针通过指针传递多维向量?

从 C++ 中的函数返回指向数组的指针?