J'ai un bout de code (pondu lors d'expérimentations) qui réagit de façon assez étrange et je me demande où est l'erreur.
Voici le bout de code incriminé:
Le résultat donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <string> #include <stdio.h> int main(void) { std::string test("test test"); std::string::iterator t1(test.begin());++t1; std::string::iterator t2(t1);++t2;++t2; std::string::iterator t3(test.end());t3--; printf("%s:: %c %c %c\r\n",test.c_str(),*t1,*t2,*t3); test.insert(t2,'!'); printf("%s:: %c %c %c\r\n",test.c_str(),*t1,*t2,*t3); test.insert(t2,'!'); printf("%s:: %c %c %c\r\n",test.c_str(),*t1,*t2,*t3); printf("wow\n"); return -1; }
Suivent, naturellement, la bacttrace et la memory map.test test:: e t t
tes!t test:: e t t
:: e ! s
wow
*** glibc detected *** ./a.out: double free or corruption (!prev): 0x00000000014b4040 ***
======= Backtrace: =========
Ce qui m'intrigue, et me fait songer à un bug de g++ plutôt qu'a une bêtise de ma part (qui est, certes, également possible vu que j'ai un doute quant au fait de jouer comme ça avec les itérateurs) c'est que test.c_str() renvoie une chaîne nulle?
Le fait qu'il semble y avoir un double free n'est pas non plus étranger à ma pensée que j'aie pu découvrir un bug.
Donc, si quelqu'un peut tester avec un compilo différent et/ou expliquer que c'est normal (et le pourquoi du comment tant qu'a faire) je suis preneur.
Ah, oui, "$g++ -v" me donne:
PS: oui, je sais, printf c'est pas bien pour le C++ et blablabla... mais moi j'aime pas les flux, parce que je n'aime pas taper un code super long pour rien, et en plus pour moi, les opérateurs << et >> servent au décalage de données, pas à envoyer des données dans un objet complètement différent (pour ça y'a "operator+=" avec opérateurs de cast et constructeurs surchargés... mais là n'est pas le sujet)Envoyé par g++ -v
Partager