2011-09-09 5 views
1

Considérez le code suivant:** *** glibc détectée libre(): pointeur non valide: 0x0000000000400b2c

int main() 
{ 
    char* s = (char*) malloc(sizeof(char)*10); 
    s="hello"; 
    free(s); 
} 

Lors de l'exécution de ce programme, je reçois une erreur:

** glibc detected *** free(): invalid pointer: 0x0000000000400b2c

Mes recherches sur ce erreur indique qu'il peut être causé par ne pas attribuer suffisamment d'espace mémoire via malloc(). Mais le programme appelle déjà malloc(), produisant assez d'espace pour 10 char s.

+0

Ce n'est pas le style moderne de C++, même si C++ est valide. Ramassez [un bon livre d'introduction sur C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) et apprenez le bon C++. Par exemple, au lieu d'utiliser 'malloc()', vous pouvez utiliser la classe 'std :: string' largement supérieure et beaucoup plus facile à utiliser en C++. –

+0

Juste soulignant, la question est liée à C, pas C++ – EddieBytes

+0

@EddieBytes: la question a été étiqueté à l'origine C++ seulement. Je ne suis pas sûr d'approuver l'édition qui l'a marqué C, ce qui introduit un autre problème avec le résultat de 'malloc'. – Mat

Répondre

10
s="hello"; 

Vous attribuez une autre adresse à s dans une mémoire allouée statiquement. Libérer n'est pas correct. De plus, puisque vous faites cela, vous traces de fuites essentiellement la mémoire que vous avez alloué ici:

char* s = (char*) malloc(sizeof(char)*10); 

Essayez:

int main() 
{ 
    static const size_t kBufferSize = 10; 
    char* s = (char*) malloc(sizeof(char) * kBufferSize); 
    strncpy(s,"hello", kBufferSize); // better than strcpy, you are protecting 
          // yourself from a buffer overflow 
    free(s); 
} 
+1

le modèle de 'malloc'result est mauvais C.' sizeof (char) 'est par définition 1.'strncpy' remplit le buffer avec 0 (dans ce buffer de 10 pas de problème, dans les buffers plus gros cela peut être un proble), et ne garantit pas une terminaison' NUL'. Votre 'principal' n'a pas de' retour'. Si vous donnez un exemple, essayez d'écrire C. –

+0

L'exemple est une édition de ce que l'OP a donné. Je ne peux pas assumer la valeur qu'il souhaite revenir de son principal. Pour le reste de vos arguments, veuillez élaborer sur vos déclarations et poster un meilleur code. Merci. En outre, strncpy, bien sûr, il ne se termine pas par NULL, c'est une fonction de mémoire et non une fonction de type de chaîne de caractères, malgré le nom. – EddieBytes

+3

Un octet est un octet par définition, donc sizeof (char) sera toujours 1, une meilleure implémentation serait sizeof (* s). En C, lancer le résultat de malloc est inutile et peut cacher d'autres erreurs (comme oublier de définir malloc, résultant en une définition implicite de malloc qui retourne un int) est donc considéré comme une mauvaise forme. Si cela aide à éclaircir les choses. –

1

C'est une erreur de passer à free() tout ce qui ne vient pas de malloc().

Affecter "hello" à s puis tenter de le libérer enfreint cette règle.

0

l'erreur est que vous libérez de la mémoire que vous ne possédez pas. vous libérez une chaîne littérale, plutôt que la mémoire créé explicitement demandé par malloc/new & co ..

9

Après:

s="hello"; 

s ne pointe plus à la mémoire allouée dynamiquement vous. Il pointe vers cette chaîne littérale "hello". Vous ne pouvez pas libérer cela parce que ce n'était pas malloc ed en premier lieu. Et vous avez divulgué cette allocation puisque vous n'avez plus de pointeur dessus.

Examinez la fonction strncpy pour copier une chaîne C dans une autre chaîne.

2

Vous Réaffectation s du pointeur « d malloc à une constante chaîne littérale , que vous essayez ensuite de free. Comme le littéral de chaîne n'a pas été attribué avec malloc, free il conduit sans surprise à de mauvaises choses.

Oh, et je vois que vous avez lancé le retour de malloc. Si vous utilisez C, vous ne devriez pas faire cela; Si vous utilisez C++, vous devez utiliser new/delete plutôt que malloc/free.

Questions connexes