2010-03-31 10 views
3

J'écris un logiciel pour simuler le schéma d'allocation de mémoire «first-fit».Allocation de mémoire C++ et implémentation de listes chaînées

Fondamentalement, j'alloue un gros bloc de mémoire de X méga-octets et le subdivise en blocs lorsque des blocs sont demandés selon le schéma.

J'utilise une liste chaînée appelée « nœud » en-tête pour chaque bloc de mémoire (afin que nous puissions trouver le bloc suivant sans boucle fastidieusement par chaque valeur d'adresse.

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)); 

`

mais cette dernière retourne ligne:

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

Je comprends pourquoi cela est invalide .. mais comment puis-je placer mon noeud dans l'emplacement du pointeur de ma mémoire nouvellement allouée

+0

Est-ce que ce travail est fait? –

+0

Oui c'est le cas, ma question implique une aide syntaxique plus que théorique. – pws5068

Répondre

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

Ainsi, il est de ne pas copier le head_node dans head_ptr (vous pensez memcpy), il est pour initialiser la mémoire (compensation à 0, marquage libéré, etc. ...).

Dans ce cas, vous pouvez simplement jeter le head_ptr à un node*:

node* head_node = (node*)head_ptr; 

Et maintenant, vous n'avez pas delete head_node ou copier les valeurs head_ptr du tout.

+0

Merci pour cette solution élégante.Vous avez raison, je confondais le but de memset avec memcpy et je vois comment cela aurait pu fonctionner aussi. – pws5068

1

Lire les docs. memset prend un int (mais interprété comme un unsigned char) en tant que second paramètre. Cela spécifie la valeur pour définir le premier n octets, où n est le troisième paramètre de la zone de mémoire à.

Vous pouvez utiliser memcpy pour copier une zone de mémoire dans une autre. Essayez:

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

EDIT: Une autre alternative consiste à utiliser une distribution de pointeur de head_ptr pour définir les valeurs précédentes et suivantes, comme suggéré par Simon.

0

Vous ne pouvez pas attribuer de pointeurs de ce type. Le deuxième argument est int à être répété.

De 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. 
1

Si je comprends bien votre question, vous voulez construire votre objet nœud dans la mémoire allouée et pointée par head_ptr. Si vous avez besoin du constructeur de nœud à être appelé, vous le faire via l'opérateur placement new comme ceci:

node* head_node = new(head_ptr) node; 

Si vous devez vous assurer que le destructor est appelé aussi bien, alors vous devez appeler supprimer manuellement:

head_node->~node(); 
+0

S'il utilise 'placement new' alors il devrait aussi utiliser' placement delete' - ne peut faire aucune supposition sans la définition de 'node'. Les chances sont 'placement nouveau' peut être complètement ignoré car il est probablement juste une' struct' stupide. – vladr

+0

Placement new serait 'new (head_ptr) node', vous construisez un' node' avec 'head_ptr' comme argument. –

+0

@Simon - whoops, merci d'avoir attrapé ça. – zdan