所以我遇到的一个主要问题是确定C / C ++中的给定函数是否进行内存分配。我经常使用外部库,其中一些函数返回指向新对象的指针。是否存在一些基本的设计范例或惯例,如果有东西分配内存,它会提前让我知道?
看起来任何返回指向新对象的指针的函数都必须分配内存,但似乎并非总是如此。例如,fopen不
编辑:要清楚,我无法访问源代码,所以我不能只检查它是否使用new或malloc等。
答案 0 :(得分:3)
阅读您使用的所有库的文档。他们应该告诉你是否应该释放某些东西。
答案 1 :(得分:2)
如果他们很好地记录了这些库(就像所有内置的库一样),那么它应该在帖子条件,子部分副作用的函数中表示“调用者必须自由”的行。
答案 2 :(得分:0)
对于C ++,任何调用new或new []的东西都会分配内存。所以如果一个函数调用那些函数或者调用调用new的任何函数(调用任何函数......等等),那么函数就会这样做。
除了调用malloc,calloc和family之外,在C中也是如此。
答案 3 :(得分:0)
最好的,或者至少是最简单的解决方案当然是文档。
但是,如果你想确定该函数不使用malloc,你可以将malloc(及其朋友calloc,realloc并最终免费)包装起来以收集一些统计数据。
编写包装器很简单,至少如果可以使用dlsym(3)(抱歉我不知道windows方式),这里是malloc的代码:
void *malloc(size_t s) {
// Retrieve the pointer to the libc's malloc
// I use a static var to avoid time penality
static void* (*real_malloc)(size_t) = NULL;
if (!real_malloc) real_malloc = dlsym(RTLD_NEXT,"malloc");
stat.nmalloc += 1; // count malloc calls
stat.smalloc += s; // count malloced size
// You can also directly print malloc's parameters
// but you first need to check that stdio functions
// doesn't use malloc, or write your own printer
return real_malloc(s);
}
在我的示例中,我使用静态全局结构来存储每个函数的调用数以及每次调用时的大小总和。包装器代码只是在一个小的库中,你可以用你的测试代码链接(或者,如果你直接打印统计数据,你可以使用LD_PRELOAD。)
结果很有意思,例如,你说fopen不使用malloc,使用那种技巧,你可以看到它是假的。例如,在最近的64位Linux系统上,当使用fopen时,我得到了一个用于568字节的malloc调用([编辑]当然免费是在fclose中完成的。)