gpt4 book ai didi

c - 按副本或按引用排队

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:09 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

假设下一个结构:

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

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

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

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

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

关于c - 按副本或按引用排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50912392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com