我想使用Linux的库(documentation)SHA1函数返回无符号的字符指针。据我了解,它创建了一个新的数组,但这并不意味着我必须释放用于它的内存?我怎么知道我是否应该使用free或delete []?我想这个特定的函数使用C分配内存的方式,但我怎么知道一般?一些C++函数返回char数组而不是std :: string。字符指针返回值垃圾
回答
请记住,虽然它可能使用malloc
分配了堆上的内存,但它也可能会返回一个指向专用于该函数范围的静态固定长度数组的指针。这对于Linux上的库函数并不是非典型的,特别是那些不可重入的库函数。所以如果你在指向一个静态数组的指针上调用free()
,你将会得到某种未定义的行为。
例如,从该段的文档为SHA1()
:)
SHA1(计算在d的n个字节和 其放置在MD的SHA1消息摘要(其必须具有空间SHA_DIGEST_LENGTH == 20 字节的输出)。如果md为NULL,则摘要将置于一个静态的 数组中。
它看起来对我来说,返回指针或者将被指向你通过md
参数已经输入的阵列,或者,如果md
说法是NULL
,返回指针指向静态数组私人的功能。我没有看到它提到你必须明确释放函数返回的指针。
,一般只和正确答案:阅读文档。您使用的每个外部函数都必须在文档中告诉您它期望什么类型的输入以及它返回的内容。
如果它说它返回一个指向内存分配为malloc
(或等效)的指针,则必须自己free
。
(实际上,你可能有时也许能够运行valgrind
和底座上的报告中猜测,但是这不是一个“解决方案”,它更是猜测。)
你应该使用evp_* functions而不是您引用的那些较低级别的函数。那里有功能用于销毁和创建摘要。
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
如何散列存储是由你。
如果'md'为NULL,那么它是一个专用于该函数的静态数组...因此,如果不需要,您不必将存储明确地传递给该函数。 – Jason 2012-02-11 17:43:05
我将这个事实添加到我的答案中。谢谢。 – SplinterOfChaos 2012-02-11 19:05:34
你的代码的问题是你重载了返回缓冲区,因为返回的指针是** not **指向一个以NULL结尾的字符串。你应该只打印20个字节,就是这样。 – Jason 2012-02-11 19:43:36
- 1. 返回指针变成垃圾... C++
- 2. Dnsqueryconfig返回垃圾字符!
- 3. AfxGetAppName()返回垃圾字符
- 4. memset设置字符指针NULL /垃圾
- 5. 结合使用类指针返回垃圾值
- 6. 返回指针是c中的垃圾值
- 7. C函数返回指向垃圾内存的指针
- 8. GetWindowLongPtr返回垃圾
- 9. Android:AudioRecord.read()返回垃圾
- 10. CURL返回垃圾
- 11. UITextField文本值返回垃圾
- 12. 字符串文字的垃圾回收
- 13. 的file_get_contents返回垃圾
- 14. Win32 LB_GETTEXT返回垃圾
- 15. OpenCV Traincascade返回垃圾
- 16. Base64解码返回垃圾
- 17. System.Text.Ecoding.UTF8.GetString返回垃圾
- 18. 类中的指针垃圾,C++
- 19. 垃圾收集与共享指针
- 20. 字符串的垃圾回收
- 21. Java 8字符串垃圾回收
- 22. 程序在返回cstring时返回垃圾值
- 23. Malloc'ed字符串包含垃圾值
- 24. 返回一个字符串,但得到的垃圾
- 25. C++返回字符串不断变垃圾
- 26. ZooKeeper返回HBase服务器地址的垃圾字符
- 27. 返回数组的Javascript垃圾回收
- 28. 返回字符指针的函数
- 29. 字符串格式返回指针值,而不是数字
- 30. printf()打印垃圾字符
尝试做两个,因为它不会给任何错误删除删除的指针。 – linuxeasy 2012-02-11 17:05:49
但是,如果您释放使用新关键字创建的内存并不会抛出错误,反之亦然? – Pijusn 2012-02-11 17:07:29
嗯,那么Kerrek说,阅读文档,因为事情不是非常笼统的C++ – linuxeasy 2012-02-11 17:09:26