【问题标题】:A queue of pointers change its value一个指针队列改变它的值
【发布时间】:2026-01-29 15:05:01
【问题描述】:

当我将 struct 的指针推入 std::queue,然后弹出该值时,我返回的值将变为零。我已经简化了实际代码来说明下面的问题。实际代码中的head 指针是一个类变量,包含其他值。如果我将head 推送到队列中,我得到的所有其他值也会变为未初始化。

这可能是什么问题?

注意:PipePixel *head;是类头文件中声明的实例变量。

添加头部功能:

void LinkedGraph::addHeadPixel(int index) {

    PipePixel pixel = {NULL, 433, std::vector<PipePixel*>()};
    pixel.index = index;

    if (head==NULL) {
        pixelMap[index] = &pixel;
        head = &pixel;
    } else {
        printf("Already added head pixel! Px:%d\n", pixelMap[index]->index);
    }
}

打印函数:

std::queue<PipePixel*> printQueue;
printQueue.push(head);
printf("headIndex:%d\n", head->index); // headIndex:433

while (!printQueue.empty()) {

    PipePixel *child = printQueue.front();
    printf("childIndex:%d\n", child->index); //childIndex:0
    printQueue.pop();

    if (child == NULL) {
        printf("child is null"); // no output
        continue;
    }  
}

PipePixel 结构:

struct PipePixel {

    PipePixel *parent;
    int index; //pixel index
    std::vector<PipePixel*> children;
};

【问题讨论】:

  • 在哪里您声明了pixel 变量?它是否在另一个范围内(比如在另一个函数中)而不是你的打印循环?您可以尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们吗?
  • 希望这些变化有所帮助

标签: c++ pointers struct queue


【解决方案1】:

这里的问题是变量pixelLinkedGraph::addHeadPixel 函数内部是局部的。一旦函数返回,该对象被破坏并且变量不再存在。如果您存储了指向局部变量的指针,则该指针不再指向有效对象,并且取消引用该指针会导致未定义的行为

我的建议是根本不使用指针,而是让编译器处理对象复制。对于如此小而简单的对象,其可能的性能影响可以忽略不计。

【讨论】:

  • @SiTeFeng 在简化代码时,通常最好尝试创建一个Minimal, Complete, and Verifiable Example。仅仅“简化”现有代码通常会导致不相关的错误,从而使真正的问题难以发现。
  • 感谢您的澄清。但是,当我第一次打印head 时,它会产生与初始化相同的有效值,这是怎么回事?我读过 C++ 引用计数会在变量被引用时保留它。但也可能是没有像你说的那样被覆盖的垃圾数据。
  • @SiTeFeng C++ 没有对象的引用计数。未定义行为的一种可能性是它可能似乎工作正常。
最近更新 更多