按副本或按引用排队

queue by copy or by reference

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

  1. 按副本排队 复制排队意味着发送到队列的数据被逐字节复制到 队列。

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

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

你的问题的答案取决于它。

假设下一个结构:

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