字符指针返回值垃圾

时间:2012-02-11 17:02:59

标签: c++ pointers memory-management arrays

我想使用来自Linux库(documentation)的SHA1函数,它返回unsigned char指针。据我所知它创建了一个新的数组,但这不是说我必须释放用于它的内存吗?我怎么知道我应该使用免费还是删除[]?我想这个特殊的函数使用C方式分配内存,但我怎么知道呢?一些C ++函数返回char数组而不是std :: string。

4 个答案:

答案 0 :(得分:4)

请记住,虽然它可能使用malloc在堆上分配了内存,但它也可能返回一个指向函数范围内的静态固定长度数组的指针。这对Linux上的库函数来说并不典型,特别是那些不可重入的函数。因此,如果在指向静态数组的指针上调用free(),那么您将获得某种类型的未定义行为。

例如,来自SHA1()的文档的这一部分:

  

SHA1()计算d和n字节的SHA-1消息摘要   将它放在md中(必须有SHA_DIGEST_LENGTH == 20的空格   输出的字节数)。如果md为NULL,则摘要将置于静态   阵列。

在我看来,返回指针要么指向你通过md参数输入的数组,要么md参数是NULL,返回指针指向函数私有的静态数组。我没有看到它提到你必须显式释放函数返回的指针。

答案 1 :(得分:0)

唯一正确和正确的答案:阅读文档。您使用的每个外部函数都必须在其文档中告诉您它期望的输入类型和返回的内容。

如果它返回指向分配有malloc(或等效内容)的内存的指针,则必须自己free

(实际上,您有时也许可以运行valgrind并根据报告进行有根据的猜测,但这并不是解决方案,而是因为它是猜测。)

答案 2 :(得分:0)

您应该使用evp_* functions而不是您引用的那些较低级别的函数。那里有用于销毁和创建摘要的函数。

答案 3 :(得分: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

如何存储哈希值取决于您。