首页 > 解决方案 > 按副本或按引用排队

问题描述

有两种方式可以实现队列行为:

  1. Queue by copy 复制队列意味着发送到队列的数据被逐字节复制到队列中。

  2. 引用队列 引用队列意味着队列只保存指向发送到队列的数据的指针,而不是数据本身。

我想问一下,通过复制一个包含指针的结构来排队是否会创建一个副本或直接访问指向的内存。谢谢你。

标签: cfreertos

解决方案


您的问题的答案是这取决于。

假设下一个结构:

struct a_t
{
  int id;
  char *name;
};

当将结构的一个实例分配给另一个时,源被复制,但它是浅拷贝。

一般来说,当内部指针指向动态分配的块,并且分配的唯一指针在结构中时,我会说它需要一个深拷贝,如果你只是分配内存可能会泄漏......

在某些情况下,浅拷贝就足够了:

//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);
  } 
}

推荐阅读