gpt4 book ai didi

c - 如何将 asprintf 与 Boehm GC 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 23:56:50 25 4
gpt4 key购买 nike

据我所知,asprintf 调用 malloc。如果我用 Boehm GC 替换 malloc,对 asprintf 的调用仍然调用传统的 malloc - 至少 valgrind 是这样告诉我的:

这是 malloc 宏:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

#include <gc.h>
#define malloc(n) GC_MALLOC(n)
#define calloc(m,n) GC_MALLOC((m)*(n))
#define realloc(p,n) GC_REALLOC((p),(n))

typedef char * string;

这是 valgrind 报告:

hopcroft:didactic_scheme(flexible_strings) scotttaylor$ valgrind --suppressions=./boehm-gc.suppressions --leak-check=full bin/escheme -e 1
==16130== Memcheck, a memory error detector
==16130== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==16130== Using Valgrind-3.6.0.SVN and LibVEX; rerun with -h for copyright info
==16130== Command: bin/escheme -e 1
==16130==
--16130-- bin/escheme:
--16130-- dSYM directory is missing; consider using --dsymutil=yes
1==16130==
==16130== HEAP SUMMARY:
==16130== in use at exit: 4,312 bytes in 3 blocks
==16130== total heap usage: 3 allocs, 0 frees, 4,312 bytes allocated
==16130==
==16130== 128 bytes in 1 blocks are definitely lost in loss record 2 of 3
==16130== at 0x100012D75: malloc (vg_replace_malloc.c:236)
==16130== by 0x1000918EC: asprintf (in /usr/lib/libSystem.B.dylib)
==16130== by 0x1000013FA: printInt (in bin/escheme)
==16130== by 0x100001D38: print (in bin/escheme)
==16130== by 0x100001DC5: main (in bin/escheme)
==16130==
==16130== LEAK SUMMARY:
==16130== definitely lost: 128 bytes in 1 blocks
==16130== indirectly lost: 0 bytes in 0 blocks
==16130== possibly lost: 0 bytes in 0 blocks
==16130== still reachable: 4,184 bytes in 2 blocks
==16130== suppressed: 0 bytes in 0 blocks
==16130== Reachable blocks (those to which a pointer was found) are not shown.
==16130== To see them, rerun with: --leak-check=full --show-reachable=yes
==16130==
==16130== For counts of detected and suppressed errors, rerun with: -v
==16130== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 66 from 13)

这是调用 malloc 的代码:

static string printInt(Object self) {
string str;
asprintf(&str, "%lu", getValueInt(self));
return str;
}

解决方法可能是使用 asprintf,然后使用 malloc 复制它以便使用 malloc 宏而不是原始函数:

static string printInt(Object self) {
string tmp;
string str;

asprintf(&tmp, "%lu", getValueInt(self));
str = calloc(sizeof(string), strlen(tmp) + 1);

strcpy(str, tmp);
free(tmp);

return str;
}

这看起来很愚蠢——它涉及到一堆不必要的复制,而且恰好是一个代码眼睛痛的 IHMO。那么有没有一种安全的方法可以在仍然使用 Boehm GC 的同时使用 asprintf 和其他可能调用 native malloc 的系统库?有没有我应该使用的替代 asprintf 的方法?

最佳答案

snprintf 返回在提供的缓冲区足够大的情况下本应写入的字符数。您可以调用此方法两次(一次以获得正确的缓冲区大小,然后再次使用足够大的缓冲区以获得输出),但是这可能比仅复制 asprintf 的输出效率低> 进入可收集的缓冲区。下面是一个包含代码的示例,该代码分配一个足够大的缓冲区以包含 32 位系统的 unsigned long 的最大值。在没有足够空间的系统上,缓冲区会重新分配并重新格式化。

#include <limits.h>

...

unsigned long intValue = getValueInt(self);
size_t maxLength = 11; // heuristic
char *buf = malloc(maxLength);

int result = snprintf(buf, maxLength, "%lu", intValue);
if (result > maxLength)
{
// shouldn't ever get here, but just in case the buffer is too small
// we reallocate it to the correct size and try again.
buf = malloc(result);
snprintf(buf, result, "%lu", intValue);
}

return buf;

关于c - 如何将 asprintf 与 Boehm GC 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com