【问题标题】:value store in vector changed when I use pointer to set the value当我使用指针设置值时,向量中的值存储发生了变化
【发布时间】:2021-12-20 23:59:33
【问题描述】:

我试图写一个 n 叉树,每个节点包含 4 个元素,1 个向量,3 个变量。

当我尝试通过指针赋值时,我发现该值将被后面的值覆盖。

我想可能是因为指针指向每个值,所以所有的值都是一样的。所以我尝试将指针设置为NULL,但还是不行。

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
struct Node{
    vector<Node*> subNodes;
    bool isFile=0;
    bool isDir=0;
    int value=0;

};

int main()
{

    Node* rootNode_ptr;
    Node rootNode;
    rootNode_ptr =&rootNode;
    rootNode_ptr->value=99;

    for(int i=0;i<5;i++){
        Node* subNode_ptr;
        Node subNode;
        subNode_ptr=NULL;
        subNode_ptr = &subNode;
        subNode_ptr->value=i;
        rootNode_ptr->subNodes.push_back(subNode_ptr);

        cout<<"0 : "<<rootNode_ptr->subNodes[0]->value<<endl;
        cout<<rootNode_ptr->subNodes[i]->value<<endl;

    } 
    return 0;
}

subNodes[0].value 不断变化

【问题讨论】:

  • 您误解了复制的工作原理。你用五个指针填充rootNode,它们都指向同一个节点。
  • Node subNode; 在循环内意味着您创建了一个对象,该对象将在此循环迭代结束时停止存在。但是您存储了指向该对象的指针,因此当循环迭代结束时,这些指针变成了悬空指针。

标签: c++ pointers


【解决方案1】:

在 for 循环中声明的变量在堆栈上。当它们超出范围时(例如,循环重复或循环终止),变量就会被销毁。存储指向已销毁对象的指针会在您读取它们时导致未定义的行为。您需要对象持续更长时间。最明显的方法是在堆上分配它们(也许通过使用“new”操作,或 std::make_unique()),直到您删除它们(或 unique_ptr 超出范围)它们才会消失。 )

在分配给它之前将指针设置为空是没有帮助的。

所以不要这样:

    Node* subNode_ptr;
    Node subNode;
    subNode_ptr=NULL;
    subNode_ptr = &subNode;
    subNode_ptr->value=i;

试试这个: 节点 subNode_ptr = 新节点; subNode_ptr->value = i;

请务必稍后清理。您的节点的析构函数需要迭代向量并删除每个元素。此外,您还需要担心将一个节点复制和分配给另一个节点,因为指针向量需要进行深度复制。 (由于节点“认为”它们拥有指向的对象,如果两个都指向同一个对象并且一个后来被销毁,它将删除该对象。然后剩余的副本将尝试使用它并发生 UB。)

【讨论】:

  • 非常感谢,让我知道原来的for循环有这样的特点
猜你喜欢
  • 2018-08-12
  • 2018-07-21
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
相关资源
最近更新 更多