调整堆内存大小
Resizing Heap Memory
所以我正在尝试围绕 malloc()
和 realloc()
制作一个非常简单的包装器,以作为垃圾收集器的惰性解决方案。问题是设计垃圾收集器缓冲区。我想存储一个指向指针的指针。
所以我需要在初始化时分配任意大小的内存。我认为问题出在这个函数中。我希望此函数能够在检测到缓冲区已满时调整缓冲区的大小。但目前,只有当我有一个大缓冲区时才会高兴,这样我就不需要使用这个功能了。
typedef struct ALLOC_STRUCT {
void *cur_ptr;
int index;
} alloc_T;
typedef struct GC_STRUCT {
alloc_T **buffer; // Pointer that points to array of alloc_T pointers.
int count; // Size of the buffer.
} gc_T;
void gc_resize(gc_T *gc) {
if (gc->count == 4 && gc->count != 0) {
gc_T *new_gc = realloc(gc, (sizeof *new_gc) + sizeof(uintptr_t) * (gc->count + ALLOCATION));
if (new_gc) {
gc = new_gc;
gc->buffer = realloc(gc->buffer, sizeof(uintptr_t) * (gc->count + ALLOCATION));
gc->count = gc->count;
} else {
// Error handling
}
}
}
我想知道这个问题是否可能是 realloc()
调用过多(我认为情况并非如此)或者我对垃圾收集器的实现有误。任何人都可以找到任何问题吗?
如果有人真的感兴趣,这里是源代码:
https://github.com/Zernoxi/New_Programming_Language/tree/memory_experiment/src
感谢@JoëlHecht 和@4386427 的帮助。看来我误解了双指针的工作原理。
void gc_resize(gc_T *gc) {
if (gc->count % 13 == 0 && gc->count != 0) {
new_buffer = realloc(gc->buffer, sizeof(void *) * (gc->collect + 14));
if (new_buffer == NULL) {
// Error handling
}
gc->buffer = new_buffer;
}
}
所以我正在尝试围绕 malloc()
和 realloc()
制作一个非常简单的包装器,以作为垃圾收集器的惰性解决方案。问题是设计垃圾收集器缓冲区。我想存储一个指向指针的指针。
所以我需要在初始化时分配任意大小的内存。我认为问题出在这个函数中。我希望此函数能够在检测到缓冲区已满时调整缓冲区的大小。但目前,只有当我有一个大缓冲区时才会高兴,这样我就不需要使用这个功能了。
typedef struct ALLOC_STRUCT {
void *cur_ptr;
int index;
} alloc_T;
typedef struct GC_STRUCT {
alloc_T **buffer; // Pointer that points to array of alloc_T pointers.
int count; // Size of the buffer.
} gc_T;
void gc_resize(gc_T *gc) {
if (gc->count == 4 && gc->count != 0) {
gc_T *new_gc = realloc(gc, (sizeof *new_gc) + sizeof(uintptr_t) * (gc->count + ALLOCATION));
if (new_gc) {
gc = new_gc;
gc->buffer = realloc(gc->buffer, sizeof(uintptr_t) * (gc->count + ALLOCATION));
gc->count = gc->count;
} else {
// Error handling
}
}
}
我想知道这个问题是否可能是 realloc()
调用过多(我认为情况并非如此)或者我对垃圾收集器的实现有误。任何人都可以找到任何问题吗?
如果有人真的感兴趣,这里是源代码: https://github.com/Zernoxi/New_Programming_Language/tree/memory_experiment/src
感谢@JoëlHecht 和@4386427 的帮助。看来我误解了双指针的工作原理。
void gc_resize(gc_T *gc) {
if (gc->count % 13 == 0 && gc->count != 0) {
new_buffer = realloc(gc->buffer, sizeof(void *) * (gc->collect + 14));
if (new_buffer == NULL) {
// Error handling
}
gc->buffer = new_buffer;
}
}