一次释放堆上多个区域的机制

A mechanism to free multiple regions on the heap at once

为了让我的项目更清晰,我想避免以这种方式使用 free(3)

free(ptr1);
free(ptr2);
.
.
.
free(ptrn);

所以我以这种方式添加了一个宏

#define stop_point NULL
#define free_space(...){ \
void *ptrs[] = {__VA_ARGS__,stop_point};              \
for(int i=0;ptrs[i]!=stop_point;i++) free(ptrs[i]);}

并按如下方式使用它:

free_space(ptr1,ptr2,...ptrn);

我认为这种机制可行,但有一个问题,例如在上一行中,如果 ptr2 为 NULL,则 ptr2 之后的其他指针(即 ptr3、ptr4...)将不会得到 free。 我需要的是更好的stop_point。我怎样才能做到这一点?

谢谢。

使用不同的哨兵。将宏更改为:

#define free_space(...) { \
    void *ptrs[] = { __VA_ARGS__, ptrs }; \
    for (int i = 0; ptrs[i] != ptrs; i++) free(ptrs[i]); }

或者使用从列表创建的数组的长度:

#define free_space(...) { \
    void *ptrs[] = { __VA_ARGS__ }; \
    for (size_t i = 0; i < sizeof ptrs / sizeof *ptrs; i++) free(ptrs[i]); }