簡體   English   中英

按副本或參考排隊

[英]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

如果將一個實例復制到另一個實例,則內存不會泄漏,因為所有指針都保存在字典中。

在其他情況下則不會,因此您應該執行深層復制,主要是在一個實例中釋放struct成員並且您不希望它影響另一實例時。

如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM