c - 按副本或按引用排队
问题描述
有两种方式可以实现队列行为:
Queue by copy 复制队列意味着发送到队列的数据被逐字节复制到队列中。
引用队列 引用队列意味着队列只保存指向发送到队列的数据的指针,而不是数据本身。
我想问一下,通过复制一个包含指针的结构来排队是否会创建一个副本或直接访问指向的内存。谢谢你。
解决方案
您的问题的答案是这取决于。
假设下一个结构:
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);
}
}
推荐阅读
- java - 如何让spring为JdbcMetadataStore创建对应的schema?
- c# - 发布中的 C# Windows 窗体应用程序引用错误
- roslyn - vsix 项目上下文菜单 visualstudioworkspace
- vb.net - 无法在 Datatable 的 Select 方法上加载数据
- c# - C# Instagram 私有 api GetUserTimelineFeedAsync 函数“方法不允许”
- apache-kafka - Kafka 如果消费者组成员出现故障,消息会发生什么?
- caching - 计算 2 个缓存级别的 CPI?
- google-colaboratory - 尝试在 google colab 中执行 easygui 模块,但没有收到显示名称和 $DISPLAY 环境变量
- pythonanywhere - 如何使用 react native 将文件上传到 pythonanywhere?
- c - 变量超出了 for 循环中的指定限制