gpt4 book ai didi

c++ - 自定义内存分配和删除

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

struct Rational
{
int a;
int b;
};

struct NextOnFreeList
{
NextOnFreeList *next;
};

// Build the linked-list
NextOnFreeList* freeList = NULL; // head of the linked-list
size_t size = (sizeof(Rational) > sizeof(NextOnFreeList *)) ? sizeof(Rational) : sizeof(NextOnFreeList *);
NextOnFreeList *runner = static_cast <NextOnFreeList *> new char [size]; // LineA
freeList = runner;
for (int i = 0; i < EXPANSION_SIZE; i++) {
runner->next = static_cast <NextOnFreeList *> new char [size];
runner = runner->next;
}
runner->next = 0;

问题1> LineA由于 Rational 的大小(即 8 个字节)大于 NextOnFreeList(即 4 个字节),链表中的每个元素将只使用部分分配的内存。对吗?

// Delete the linked-list

NextOnFreeList *nextPtr = NULL;
for (nextPtr = freeList; nextPtr != NULL; nextPtr = freeList) {
freeList = freeList->next;
delete [] nextPtr; // LineB
}

问题 2> B 行为什么我们应该使用 'delete [] nextPtr' 而不是 'delete nextPtr'?

问题3>

Rational* ptr = static_cast<Rational*>( freeList ); // LineC
ptr->a = 10;
ptr->b = 20;

通过 LineC 是否正确,我们可以带回所有分配的原始大小为 'size' 的内存和使用内存存储 Rational 内部的所有元素。

最佳答案

Q1:是的,但我宁愿使用 std::allocator<Rational>::allocate (或两者的 union - 这样可以避免对齐问题)

Q2:其实是不好的,因为你应该先把它转换成 char* ,然后再使用 delete[] 。同样,使用 std::allocator 会更好。 :默认实现并不重要(调用 free ),但忘了我说过 ;) ... 直接使用 malloc/free 更安全。

Q3::没问题,但我不确定 static_cast 是否允许这样做(reinterpret_cast 或转换为 void* 可能会有帮助)

编辑:我希望您的Q3 不是最终的,因为您需要先更新空闲列表(在使用指针之前)。

第二次编辑: 链接 + 注意:将空闲列表隐藏在分配器中最适合 C++(直接在其中使用 malloc/free,或 new[]/delete[])

关于c++ - 自定义内存分配和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25552243/

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