2014-01-29 63 views
0

刪除部我有兩個例子的功能,用於刪除一個數組從陣列

第一個使用的memmove的區段,將這種方法造成的問題,當涉及到釋放分配給輸入陣列的存儲器(輸入數組總是malloc'd,例如它在堆上)?

在調用此函數之前,雙精度輸入數組已被malloc調用。這個函數試圖刪除數組中的值,例如使標準數組看起來有點像動態數組。但是,memmove調用是否意味着當輸入數組隨後被釋放(在此函數返回之後,此函數之外),那麼由於數組已被修改的事實,釋放調用可能無法正常工作?

/** 
* Remove a contiguous section of data from an array of doubles 
*/ 
void dbl_array_del(double *array, size_t *plen_array, size_t idx, size_t n_elems) 
{ 
    size_t len_array = *plen_array; 

    /* must delete at least one value */ 
    assert(n_elems > 0); 
    /* section to remove does not exceed the length of the array */ 
    assert(idx+n_elems <= len_array); 
    /* function cannot create an 'empty' array */ 
    assert(len_array-n_elems > 0); 

    if ((idx+n_elems) == len_array) { 
     /* case where section to be removed reaches end of array, no memory has 
     * to be shifted, only array length altered */ 
     len_array-=n_elems; 
    } else { 
     /* otherwise data to right of section has to be shifted left, back over 
     * removed section */ 
     memmove(array+idx, array+idx+n_elems, 
       (len_array-idx-n_elems)*sizeof(double)); 
     len_array-=n_elems; 
    }    
    *plen_array = len_array; 
} 

第二種方法不使用memmove,而是迭代需要左移的值。在內存泄漏方面這是一種更安全的方法嗎?

/** 
* Remove a contiguous section of data from an array of doubles 
*/ 
void dbl_array_del(double *array, size_t *plen_array, size_t idx, size_t n_elems) 
{ 
    size_t len_array = *plen_array; 

    /* must delete at least one value */ 
    assert(n_elems > 0); 
    /* section to remove does not exceed the length of the array */ 
    assert(idx+n_elems <= len_array); 
    /* function cannot create an 'empty' array */ 
    assert(len_array-n_elems > 0); 

    /* n is the no. of values that need shifting left */ 
    size_t n = len_array-(idx+n_elems); 
    size_t i; 
    /* shift values left */ 
    for (i=idx; i<idx+n; i++) { 
     array[i] = array[i+n_elems]; 
    } 
    /* reset values off end of array */ 
    for (i=idx+n; i<len_array; i++) { 
     array[i] = 0; 
    } 
    *plen_array = len_array-n_elems; 
} 
+0

不確定內存泄漏是您的主要問題。 – concept3d

+0

因爲這兩個版本本身都沒有分配內存,所以內存泄漏根本不會出現。目前還不清楚你認爲會出現什麼樣的問題。 – Jon

回答

2

Memmove不會傷害您的免費()。它基本上只是你的for-Loop隱藏在一個函數中(可能有一些機器特定的優化)。

如果使用malloc()分配了一個塊,則系統會記住在返回的指針上調用free()時將取消分配多少個項目。當你改變數組的內容時,不會改變,使用memmove()或你自己寫的for循環。

+0

謝謝 - 這正是我正在尋找的確認,即memmove不會影響免費..我的大腦不時在內存管理問題上捕獲 – bph

+0

如果你想要回收內存,你必須重新分配(3)數組。但那是又一個魚缸...... – vonbrand

+0

@vonbrand你是什麼意思?在調用adbl_array_del()之後釋放輸入數組足以釋放所有已分配的堆內存 - 底層的c數組的長度始終相同 - 它只是將其內容移動以使其「顯示」更小。無需realloc .. – bph

0

在安全性方面,最好的選擇是不要使用這樣的原始C數組。 std :: vector提供了一種機制來安全地管理(調整/刪除/重定位/等等)底層數據。

這就是說,在你上面的例子中,任何一種解決方案都會允許你覆蓋內存。在安全方面沒有更好的辦法。在性能方面,移動解決方案可能會有一個量身定製的實現,它可以比手動一次移動元素更快。

+2

Hiett似乎使用純C,所以沒有他的std :: vector ... – Geier

+0

是C只有我害怕 - 這是一種情況,切換到「合適」的動態數組可能會矯枉過正 - 需要一個黑客只是爲了使它看起來有些價值已被刪除 – bph