C ++内存分配&链接列表实施

时间:2010-03-31 00:22:34

标签: c++ malloc linked-list memset

我正在编写软件来模拟“首先适合”的内存分配架构。

基本上,我会根据模式分配一个大的X兆字节内存并将其细分为块。

我正在使用一个名为“node”的链表作为每个内存块的标题(这样我们就可以找到下一个块,而无需繁琐地遍历每个地址值。

head_ptr = (char*) malloc(total_size + sizeof(node));

if(head_ptr == NULL) return -1; // Malloc Error .. :-(

node* head_node = new node; // Build block header

head_node->next = NULL;
head_node->previous = NULL;

// Header points to next block (which doesn't exist yet)
memset(head_ptr,head_node, sizeof(node));

`

但最后一行返回:

 error: invalid conversion from 'node*' to 'int'

我理解为什么这是无效的..但是如何将我的节点放入我新分配的内存的指针位置?

4 个答案:

答案 0 :(得分:2)

memset(void* memory, int value, size_t size)

所以,不要将head_node复制到head_ptr(您正在考虑memcpy), 它用于初始化内存(清除为0,标记为已释放等等)。

在这种情况下,您只需将head_ptr转换为node*

即可
node* head_node = (node*)head_ptr;

现在您不必delete head_node,或将值复制到head_ptr

答案 1 :(得分:1)

阅读文档。 memset将int(但解释为unsigned char)作为第二个参数。这指定了设置第一个n字节的值,其中n是内存区域的第三个参数。

您可以使用memcpy,它会将一个内存区域复制到另一个区域。尝试:

memcpy(head_ptr, head_node, sizeof(node));

编辑:另一种方法是使用head_ptr的指针转换来设置上一个和下一个值,如Simon所建议。

答案 2 :(得分:1)

如果我理解你的问题,你想要将你的节点对象构建到head_ptr分配和指向的内存中。如果需要调用节点构造函数,可以通过placement new运算符执行此操作,如下所示:

node* head_node = new(head_ptr) node;

如果你确实需要确保也调用了析构函数,那么你必须手动调用delete:

head_node->~node();

答案 3 :(得分:0)

你不能指定那样的指针。第二个论点是重复int

来自memset(3)

SYNOPSIS
     #include <string.h>

     void *
     memset(void *b, int c, size_t len);

DESCRIPTION
     The memset() function writes len bytes of value c (converted to
     an unsigned char) to the byte string b.

RETURN VALUES
     The memset() function returns its first argument.
相关问题