在管理类指针队列时丢失向量成员,C++。

问题描述 投票:0回答:2

我有一个非常简单的类叫AClass,有两个成员:一个int和一个ints的向量。在我的程序中,我试图使用一个指向该类对象的指针队列,并在该队列上进行一个 while 循环,直到队列为空。在这个 while 循环中,我有时会创建新的对象,并将它们添加到队列中进行一些处理。我遇到的问题是,在该循环中创建的对象似乎失去了向量成员。不过int成员是可以访问的。我不明白为什么......

这里有一个小的代码例子来说明我的问题。

#include <iostream>
#include <vector>
#include <queue>
#include <string>


class AClass
{
public:
    int a_number;

    std::vector<int> a_vector;

    void print()
    {
        std::cout << "a number: " << a_number << std::endl;
        std::cout << "a vector: ";

        for (size_t i = 0; i < a_vector.size(); i++)
        {
            std::cout << a_vector[i] << "  ";
        }
        std::cout << std::endl;
    }
};


int main()
{
    std::queue <AClass*> aclass_pointers_queue;

    AClass first_aclass_object;
    first_aclass_object.a_number = 2;
    first_aclass_object.a_vector = { 1,2,3,4,5 };

    aclass_pointers_queue.push(&first_aclass_object);

    int some_break_condition = 1;

    while (!aclass_pointers_queue.empty())
    {
        AClass* current_class_object = aclass_pointers_queue.front();
        current_class_object->print();
        aclass_pointers_queue.pop();

        AClass another_aclass_object;
        another_aclass_object.a_number = 3;
        another_aclass_object.a_vector = { 5,4,3,2,1 };

        aclass_pointers_queue.push(&another_aclass_object);

        if (some_break_condition >= 2)
        {
            break;
        }
        some_break_condition++;
    }

    return 0;
}

这里是输出。

a number: 2
a vector: 1  2  3  4  5
a number: 3
a vector:

在 while 循环中创建的对象的向量没有打印出来 它的大小为零。

c++ class pointers vector member
2个回答
2
投票

在类的内部 while 循环,你正在向队列添加指针,这些指针指向一个局部变量的地址。在下一次循环迭代中,那个变量死亡,你所拥有的指针就不再有效了。

你添加到队列中的第一个指针是一个对象的地址,这个对象在循环的持续时间内活在 main所以这个指针是有效的。

可以 为你添加到队列中的指针分配内存。但你应该更喜欢使用类似 std::unique_ptr而不是原始指针,如果你选择这样做的话。


1
投票

你的程序表现出未定义的行为,因为指向本地对象的指针悬空,其寿命随着该对象在(while 循环)。) 在你的例子中,最简单的解决方案是通过值而不是通过指针来存储对象,然后让 std::queue 正确管理对象的寿命。在更复杂的情况下(比如你不想移动复制对象,或者队列可以多次包含相同的对象),你可以考虑在队列本身或其他地方通过智能指针(共享或唯一)存储动态分配的对象,这样你就可以确保你的队列不包含悬空指针。

© www.soinside.com 2019 - 2024. All rights reserved.