gpt4 book ai didi

c - 使用宏分配内存不好吗?

转载 作者:行者123 更新时间:2023-11-30 19:16:30 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

6年前关闭。




Improve this question




我想用这样的东西来分配内存:

void* pointers = NULL;
#define MALLOC(size) ({\
void* ptr = malloc(size);
ARRAYAPPEND(pointers, ptr);\
})
#define FREE(ptr) ({\
ARRAYREMOVEBYVALUE(pointers, ptr);\
free(ptr);\
})
#define FREEALL() ({\
FREEARRAY(pointers);\
})
ARRAYAPPEND当它指向 NULL 时,会将一个项目添加到一个数组中,或者创建一个包含该项目的数组
ARRAYREMOVEBYVALUEfree()数组中具有匹配值的所有项。如果数组中的所有值都匹配,它将使用 FREEARRAY() 释放整个数组.与 ARRAYREMOVEBYEXPRESSION ,例如 strcmp(value, "")也可以。 (不是说我需要使用它)
ARRAYSIZE将返回数组的大小,或者当它指向 NULL 时返回 0
FREEARRAY将释放数组中的所有指针,然后释放数组本身。如果数组指向 NULL , 不会采取任何行动。

当然我也会支持 realloccalloc .

这是分配和取消分配内存的好方法吗,是否有一个库可以更安全地执行此操作(我正在从头开始创建这些宏),我应该 free()每个内存地址都是手动的,还是我应该依靠操作系统使用不安全但有效的自动清理? (目前,只支持 Windows 8 完全没问题,而且 Windows 8 有自动清理)?我的目标是在程序退出时释放所有内存,显然不是运行时

(我可以自己发现
while (1) {
malloc(10000);
}

最终会耗尽内存,但我的问题是:
char* x = MALLOC(10000);
FREEALL();

比依赖操作系统清理更安全,如果这样:
char* x = malloc(10000);
free(x);

上面使用宏是首选。也许有对 malloc 的隐藏调用我无法控制?在这些情况下,没有真正的理由使用宏,但例如
while (strcmp(SUBSTRING(str, 0, 14), "Hello, world!") {
// Code (No cleanup)
})

可能有对 malloc 的隐藏调用在不为 free 的 SUBSTRING 内(例如用于创建新字符串) 'd。在这种情况下我应该使用宏:
SESSION_SET("SESSION1");
while (strcmp(SUBSTRING(str, 0, 14), "Hello, world!") {
// Code (No cleanup)
})
SESSION_FREE("SESSION1");

还是依靠自动清理就足够了?)

我的问题基本上是:我想在不保存地址的情况下分配内存,我应该强制自己保存每个地址和 free()它是手动的,我应该使用宏,是否有任何库可以为我做到这一点,或者我应该依赖操作系统清理?

对@wildplasser 评论的 react :
宏是内联函数... :| (编辑:好的......也许宏不检查类型。但就是这样。)而且我更喜欢输入 char* item = MALLOC(10);FREEALL();上面打字
void* array = NULL; // Array of pointers
char* item = malloc(10); // Allocate item
int size = (array == NULL ? 0 : sizeof(array) / sizeof(array[0])); // Get length of array
array = realloc(array, (size + 1) * sizeof(item)); // Reallocate array
array[size] = item; // Add item to new array
size = (array == NULL ? 0 : sizeof(array) / sizeof(array[0])); // Get new size of array (Wow, a macro would be usefull, wouldn't it?)
int i = 0; // Lets loop over all the items
while (i < size) { // In our array of pointers
free(array[i]); // And free all those pointers
}
free(array); // Lets free the array too...
array = NULL; // What did we end up doing? Nothing!

最佳答案

你在这里所做的所有工作基本上都是无用的:它是错误的并且没有达到它的目的。

程序分配的任何内存都将在结束后返回给操作系统。这适用于所有使用虚拟内存的操作系统——想想任何 32 位或 64 位现代操作系统(这里的现代意味着“本世纪制造”)。如果操作系统不这样做(或者如果没有操作系统),您就已经知道了。

因此,当您的程序仍在运行时,所有释放内存的问题都适用。

您分配内存的方式仅适用于您定义宏的这些翻译单元。在您使用外部库的那一刻(最终您将使用),您将回到原点:

// this is a function that creates a texture (for drawing to screen). IT'S ENTIRELY OUT OF YOUR CONTROL.
SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,
Uint32 format,
int access,
int w,
int h);

// somewhere in your code
SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_STATIC, 128, 64);
// now what

关于c - 使用宏分配内存不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018114/

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