2012-02-11 108 views
2

我想使用Linux的庫(documentation)SHA1函數返回無符號的字符指針。據我瞭解,它創建了一個新的數組,但這並不意味着我必須釋放用於它的內存?我怎麼知道我是否應該使用free或delete []?我想這個特定的函數使用C分配內存的方式,但我怎麼知道一般?一些C++函數返回char數組而不是std :: string。字符指針返回值垃圾

+0

嘗試做兩個,因爲它不會給任何錯誤刪除刪除的指針。 – linuxeasy 2012-02-11 17:05:49

+0

但是,如果您釋放使用新關鍵字創建的內存並不會拋出錯誤,反之亦然? – Pijusn 2012-02-11 17:07:29

+0

嗯,那麼Kerrek說,閱讀文檔,因爲事情不是非常籠統的C++ – linuxeasy 2012-02-11 17:09:26

回答

4

請記住,雖然它可能使用malloc分配了堆上的內存,但它也可能會返回一個指向專用於該函數範圍的靜態固定長度數組的指針。這對於Linux上的庫函數並不是非典型的,特別是那些不可重入的庫函數。所以如果你在指向一個靜態數組的指針上調用free(),你將會得到某種未定義的行爲。

例如,從該段的文檔爲SHA1():)

SHA1(計算在d的n個字節和 其放置在MD的SHA1消息摘要(其必須具有空間SHA_DIGEST_LENGTH == 20 字節的輸出)。如果md爲NULL,則摘要將置於一個靜態的 數組中。

它看起來對我來說,返回指針或者將被指向你通過md參數已經輸入的陣列,或者,如果md說法是NULL,返回指針指向靜態數組私人的功能。我沒有看到它提到你必須明確釋放函數返回的指針。

0

,一般只和正確答案:閱讀文檔。您使用的每個外部函數都必須在文檔中告訴您它期望什麼類型的輸入以及它返回的內容。

如果它說它返回一個指向內存分配爲malloc(或等效)的指針,則必須自己free

(實際上,你可能有時也許能夠運行valgrind和底座上的報告中猜測,但是這不是一個「解決方案」,它更是猜測。)

0

你應該使用evp_* functions而不是您引用的那些較低級別的函數。那裏有功能用於銷燬和創建摘要。

0

unsigned char *SHA1(const unsigned char *d, unsigned long n, unsigned char *md);

根據該文件,除非md==0,返回值是相同MD。如果md==0,它被放置在一個靜態數組中,所以你不必擔心它。我寫下了休耕地來證明這個概念。

#include <openssl/sha.h> 
#include <string.h> 
#include <stdio.h> 

void print_hash(const unsigned char* c) 
{ 
    printf("The hash is: "); 

    int index; 
    for(index = 0; index < SHA_DIGEST_LENGTH; index++) 
     printf("%X", *c++); 

    printf("\n"); 
} 

int main(int argc, char* argv[]) 
{ 
    unsigned char hash[SHA_DIGEST_LENGTH]; 

    unsigned char str[100]; 
    scanf("%s", str); 

    unsigned char* sha = SHA1(str, strlen((char*)str), hash); 

    print_hash(hash); 
    print_hash(sha); 
    print_hash(SHA1(str, strlen((char*)str), 0)); 
} 

結果:

some example input 
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66 
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66 
The hash is: EB875812858D27B22CB2B75F992DFFADC1B05C66 

如何散列存儲是由你。

+0

如果'md'爲NULL,那麼它是一個專用於該函數的靜態數組...因此,如果不需要,您不必將存儲明確地傳遞給該函數。 – Jason 2012-02-11 17:43:05

+0

我將這個事實添加到我的答案中。謝謝。 – SplinterOfChaos 2012-02-11 19:05:34

+0

你的代碼的問題是你重載了返回緩衝區,因爲返回的指針是** not **指向一個以NULL結尾的字符串。你應該只打印20個字節,就是這樣。 – Jason 2012-02-11 19:43:36