簡體   English   中英

C-memcpy和復制結構

[英]C - memcpy and copying structs

使用memcpy並在c中構建通用HashTable時遇到設計問題。 哈希表映射unsigned intvoid * ,我的數據memcpy過來。

// Random example
void foo() {

  // Suppose `a` is a struct that contains LinkedLists, char arrays, etc
  // within it.
  struct *a = malloc(sizeof(a));
  HashTable ht = ht_create(sizeof(a));

  // Insert the (key, value) pair (0, a) into the hash table ht
  ht_insert(ht, 0, a);

  // Prevent memory leak
  destroy_struct(a);

  // Do stuff...

  // ... eventually destroy ht
  ht_destroy(ht);
}

現在,給定struct a具有LinkedLists和指針,並且HashTable使用memcpy ,我的理解是,它復制了這些指針的淺表副本。 因此, ht_insert mallocs一個新的入口空間,從以上數據淺拷貝a ,並插入新進入其表。

因此,除非我用某些函數destroy_struct完全釋放struct a ,否則會泄漏內存。 但是,考慮到我在ht_insert淺層復制數據,當我調用destroy_struct(a) ,我也會不小心釋放了哈希表條目中指向的數據!

上面的邏輯是否正確,如果是,是否應該使用一些遞歸的memcpy函數,以確保將所有數據從struct a深度復制到HashTable?

首先,如果您的代碼不能重現您要解釋的問題,則不應包含它。 您的代碼產生的問題是編譯器錯誤。 這對您的問題沒有幫助,對嗎?

現在,給定struct a內具有LinkedLists和指針,並且HashTable使用memcpy,我的理解是它在這些指針的淺表副本上進行復制。

如果您只是將struct whatever *的內部表示形式復制到void *的內部表示形式中,那么您將遇到麻煩。 不能保證兩個表示形式相同。 一種指針類型可能比另一種更大,它們使用不同的字節序 (如果將其實現為典型的准整數),或者可能存在其他內部差異。 您應該將一個指針轉換為另一種類型,然后可以簡單地對其進行分配...實際上,由於其中一種類型為void *分配將隱式發生轉換。

因此,除非我用某些函數destroy_struct完全釋放struct a ,否則會泄漏內存。

根據您所描述的,只需要一次 (並且只能一次 )調用free該指針值, 就可以 free該指針值,並且程序不再對其有任何用處(例如將其從哈希表中刪除之后 )。 這適用於mallocrealloccalloc返回的所有非null指針。 需要說明的是:如果xy存儲由這些函數之一返回的相同指針,則free應該僅在其中一個上被調用一次 因為它們包含相同的值。

上面的邏輯是否正確,如果是,是否應該使用一些遞歸的memcpy函數,以確保將所有數據從struct a深度復制到HashTable?

我強烈建議將此問題分解為兩個或多個單獨的問題,因為它是雙管齊下的。 我可以簡單地回答“是”(或“否”)。 這會給您有意義的信息嗎?

這使我回到了我最初寫的內容。 我只能根據您在此處編寫的內容為您提供指導,這可能無法反映您所使用的代碼(尤其是考慮到您所提供的錯誤代碼的影響)。 為了更好地指導您,我需要查看所有填充的空白。我需要查看一個測試用例,該用例創建一個哈希表,插入到哈希表中,使用哈希表,從哈希表中刪除並清理哈希表確定您的操作是否在任何地方泄漏... 但是最重​​要的是,該測試用例必須是可編譯的 否則它無法執行任何這些操作,因為它無法編譯。

暫無
暫無

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

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