[C] Free const * ?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een lijst met elementen waarin een constante naam zit (const char* ) en een reference naar het volgende sturcture (een linked list).

De naam wordt, nu even als test, door de gebruiker ingegeven. Later zal dit uit een bestand komen.
Zodra een element is aangemaakt verandert de naam NIET. Maar ik wil wel elementen kunnen verwijderen. Met free krijg ik fouten; logisch want hij slikt geen const *.

Om de naam in de elementen als niet const op te geven vindt in onlogisch aangezien deze na create nooit meer verandert.

Hoe kan ik zoiets het beste oplossen?

if broken it is, fix it you should


Acties:
  • 0 Henk 'm!

  • wiho
  • Registratie: Februari 2000
  • Laatst online: 19-09 09:31

wiho

Certified Nerd

Volgens mij ontkom je hier niet aan een cast (const_cast<char*> in C++ of gewoon (char*) in C). De free functie geeft immers het geheugen vrij, waarna je geen garantie meer hebt dat de inhoud constant blijft, of zelfs maar beschikbaar. Dus een const cast is hier op z'n plek.

"Pas als het proces gecrashed is, dumpt men de core"


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

mits je de string aangemaakt hebt met malloc (of strdup), MOET je hem zelfs vrijgeven met free.
je kan je pointer gewoon casten naar non-const, mocht je compiler niet willen (maar ik dacht dat free() in C en delete in C++ beide ook pointers-naar-const konden verwerken zonder cast. staat je compiler wel in C mode ipv C++ mode?)

-niks-


Acties:
  • 0 Henk 'm!

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 17-09 23:01
De gebruikelijke manier is om de naam terug te casten naar niet const bij de free, dus naar (char *), dus:
C:
1
free((char *)name);


wat ik er misschien wat leesbaarder uitziet en wat ik zelf veel tegenkom, is dan men een "UNCONST" macro definieert:
C:
1
2
3
4
5
#define UNCONST(ptr) (void *)(ptr)

...

free(UNCONST(name));

[ Voor 41% gewijzigd door Elijan9 op 18-03-2010 08:59 ]

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Dat casten naar non-const leek bij ook het beste.

De naam wordt met een malloc verkregen en moet dus vrijgegeven worden.

if broken it is, fix it you should


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Je kan ook de lijst intern een char* laten gebruiken en de get() methode een const char* laten retourneren. Dat is ook meer in lijn met hoe je het gebruikt.

Acties:
  • 0 Henk 'm!

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Zoijar schreef op donderdag 18 maart 2010 @ 11:20:
Je kan ook de lijst intern een char* laten gebruiken en de get() methode een const char* laten retourneren. Dat is ook meer in lijn met hoe je het gebruikt.
Met C++ zou dit idd wel werken. Ik heb in C een struct gebruikt en die heeft geen private data of functies.

if broken it is, fix it you should


Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
elgringo schreef op donderdag 18 maart 2010 @ 15:06:
[...]


Met C++ zou dit idd wel werken. Ik heb in C een struct gebruikt en die heeft geen private data of functies.
Hoeft toch ook niet?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het punt was meer dat een getter zoals Zoijar voorstelt dan wat onhandig werkt omdat je die niet als method kunt definieren :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Wel via het "OO-C paradigm": een blackbox struct (forward declared pointer in de header, definitie alleen in de implementatie) die je als pointer meegeeft aan een get functie.

Dwz (heel minimaal):


C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
list.h:

#ifndef LIST_HPP_
#define LIST_HPP_

typedef struct _List* List;

List construct_List(); // ctor
void destruct_List(List self); // dtor
const char* getItem(List self); // getter

#endif

list.c:

#include "list.h"
#include <malloc.h>

// All members are effectively private
struct _List {
    char* head;
};

List construct_List() {
    List self = (List) malloc(sizeof(_List));
    self->head = 0;
    return self;
}

void destruct_List(List self) {
    free(self);
}

const char* getItem(List self) {
    return self->head;
}

main.c:
#include "list.h"

int main() {
    List list = construct_List();

    const char* item = getItem(list);

    destruct_List(list);

    return 0;
}

Een prima manier van programmeren.

[ Voor 87% gewijzigd door Zoijar op 18-03-2010 20:19 ]

Pagina: 1