C ++ Распределение памяти и реализация связанного списка - PullRequest
3 голосов
/ 31 марта 2010

Я пишу программное обеспечение для имитации схемы первичного размещения памяти.

По сути, я выделяю большой X-мегабайтный кусок памяти и делю его на блоки при запросе порций в соответствии со схемой.

Я использую связанный список, называемый «узел», в качестве заголовка для каждого блока памяти (чтобы мы могли найти следующий блок, не утомительно просматривая каждое значение адреса.

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 ]

2 голосов
/ 31 марта 2010
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 голос
/ 31 марта 2010

Если я правильно понимаю ваш вопрос, вы хотите создать объект вашего узла в памяти, выделенной и на которую указывает head_ptr. Если вам нужен вызываемый конструктор узла, вы делаете это с помощью оператора Place New следующим образом:

node* head_node = new(head_ptr) node;

Если вам нужно убедиться, что деструктор также вызывается, то вы должны вызвать delete вручную:

head_node->~node();
1 голос
/ 31 марта 2010

Прочитайте документы. memset принимает int (но интерпретируется как unsigned char) в качестве второго параметра. Здесь указывается значение для установки первых n байтов, где n - третий параметр области памяти равным.

Вы можете использовать memcpy, который будет копировать одну область памяти в другую. Попробуйте:

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

РЕДАКТИРОВАТЬ: Другой альтернативой является использование указателя head_ptr для установки предыдущего и следующего значений, как предложено Саймоном.

0 голосов
/ 31 марта 2010

Вы не можете назначать указатели, как это. Второй аргумент 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.
...