一次释放堆上多个区域的机制
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]); }
为了让我的项目更清晰,我想避免以这种方式使用 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]); }