C 按副本或引用排队
有两种方式可以实现队列行为:C 按副本或引用排队,c,freertos,C,Freertos,有两种方式可以实现队列行为: 按副本排队 复制排队是指发送到队列的数据逐字节复制到队列中 排队 按引用排队 通过引用排队意味着队列只保存指向发送到队列的数据的指针 队列,而不是数据本身 我想问的是,通过复制对包含指针的结构进行排队是否会创建对所指内存的复制或直接访问。 多谢各位 你的问题的答案是,这取决于你 假设下一个结构: struct a_t { int id; char *name; }; 将结构的一个实例指定给另一个实例时,会复制源,但它是浅层副本 一般来说,当内部指针指向动态
多谢各位 你的问题的答案是,这取决于你 假设下一个结构:
struct a_t
{
int id;
char *name;
};
将结构的一个实例指定给另一个实例时,会复制源,但它是浅层副本
一般来说,当内部指针指向动态分配的块,并且唯一指向分配的指针在结构中时,我会说它需要一个深度副本,如果您只是分配内存,可能会泄漏
在某些情况下,浅拷贝就足够了:
如果将一个实例复制到另一个实例,内存不会泄漏,因为所有指针都保存在字典中。
在其他情况下不会,因此您应该执行深度复制,主要是在一个实例中释放结构成员并且您不希望它影响另一个实例时
例如:
这是您自己的实现还是来自某个库的队列?不确定“按副本排队包含指针的结构将创建副本或直接访问指向的内存”是什么意思。这是freertos API中的队列如果是通用队列实现,我猜它是“副本”功能只在一个层次上发挥作用。我的意思是,如果您有两个任务,第一个任务使用xQueueSend(),第二个任务使用xQueueReceive(),然后尝试在第二个任务中取消对指针的引用并更改数据,这会影响第一个任务中的数据吗?是的-这是另一个优点-有些东西无法复制,或者这样做非常昂贵/有风险。
//assume you have a dictionary, or other container to save all names:
char dictionary[][] = {"name1","name2","name3"};
a_t a1 {1, dictionary[0]};
a_t a2=a1; //shallow copy is enough
void fill(a_t **ppa, int id, const char* name)
{
a_t *pa = malloc(sizeof(a_t));
pa->id = id;
pa->name = strdup(name);
erase(*ppa);
*ppa = pa;
}
void erase(a_t *pa)
{
if(pa){
free(pa->name);
free(pa);
}
}