0

So one major problem I have is determining whether a given function in C/C++ does memory allocation or not. I frequently work with external libraries, some of which have functions that return pointers to new objects. Is there some basic design paradigm or convention that will let me know ahead of time if something allocates memory?

It would seem like any function that returns a pointer to a new object must be allocating memory, but this does not always seem to be the case. For example, fopen does not

Edit: To be clear, I don't have access to the source code so I can't just check if it uses new or malloc, ect.

4

4 回答 4

3

阅读您使用的所有库的文档。他们应该告诉你是否应该释放某些东西。

于 2013-08-09T20:13:45.567 回答
2

如果他们很好地记录了库(就像所有内置库一样),那么它应该在后置条件中说明“调用者必须释放”的内容,该函数的子部分副作用。

于 2013-08-09T20:15:06.640 回答
0

当然,最好的或至少最简单的解决方案是文档。

但是,如果您想确保该函数不使用 malloc,您可以包装 malloc(及其朋友 calloc、realloc 和最终 free)以收集一些统计信息。

编写包装器很简单,至少如果可以使用 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 中完成的。)

于 2013-08-09T22:45:45.290 回答
0

对于 C++,任何调用 new 或 new [] 的东西都会分配内存。因此,如果一个函数调用这些函数或调用任何调用 new 的函数(调用任何函数......等等),它就会执行此操作。

除了调用是 malloc、calloc 和 family 之外,在 C 中也是如此。

于 2013-08-09T20:14:40.507 回答