2012-02-11 114 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