向量成员在管理类指针C++队列时丢失
Vector member is lost while managing a queue of the class pointers C++
我有一个非常简单的类,叫做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 循环中创建的对象的向量,不会打印任何内容。它的大小为零。
在while
循环中,您正在向队列添加指向指针,这些指针指向局部变量的地址。在循环的下一次迭代中,该变量将失效,并且您拥有的指针不再有效。
添加到队列中的第一个指针是在main
期间生存的对象的地址,因此该指针有效。
您可以为添加到队列的指针分配内存。但是,如果您选择走这条路,您应该更喜欢使用类似std::unique_ptr
,而不是原始指针。
由于指向本地对象的悬空指针而表现出未定义的行为,该对象的生存期以该对象在其中创建的块结束(在您的情况下while
循环(。最简单的解决方案是按值而不是指针存储对象,并让std::queue
正确管理对象的生存期。在更复杂的情况下(例如您不想移动/复制对象,或者队列可以多次包含相同的对象(,您可以考虑通过智能指针(共享或唯一(将动态分配的对象存储在队列本身或其他地方,以便确保队列不包含悬空指针。
相关文章:
- boost::进程间消息队列引发错误
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Android NDK传感器向事件队列报告奇怪的间隔
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 在一个读写器队列中,我可以用volatile替换原子吗
- 为什么我的多线程作业队列崩溃
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 使用"Task"函数指针队列定义作业管理器
- 在c++队列中使用pop和visit实现线程安全
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 共享队列的线程安全
- 带自定义比较器的最小优先级队列
- 在 Vulkan Qt 中获取队列系列
- 堆栈和队列是否像C++中的数组一样传递?
- 在C++中创建队列 - 什么是 malloc 错误?
- 优先级队列自定义比较器