296
Le logiciel R - Maˆ ıtriser le langage
Ensuite, tapez drmemory.exe -- Rgui dans votre fenˆ etre de commandes
(soyez patient), puis dans la console de R, tapez les instructions suivantes :
> dyn.load("memoire.dll")
> .C("testmemoire",10000L,3.0)
> q()
Recherchez maintenant les occurences de testmemoire dans le fichier texte qui
s’est ouvert. Cela vous indiquera les diff´ erentes lignes pouvant contenir des erreurs. Ainsi, on peut par exemple d´ etecter qu’il y a une erreur en ligne 12.
On s’aper¸ coit en fait que le tableau a est de longueur 1 (et contient au d´ epart
la seule valeur 3.0) alors que l’on cherche ` a ´ ecrire dans les cases 0 ` a 9 de ce
tableau. En outre, le pointeur ptr2 a ´ et´ e supprim´ e `
a la ligne pr´ ec´ edente.
Vous pouvez aussi essayer l’instruction R ci-apr` es, et vous constaterez dans
le gestionnaire des tˆ aches que la quantit´ e de RAM utilis´ ee par R augmente de
fa¸ con tr` es importante. Ceci est dˆ u ` a l’oubli de l’instruction delete[] ptr1;
dans le code C/C++ ci-dessus.
> for (i in 1:10000) .C("testmemoire",10000L,as.double(1:10))
Linux
L’´ equivalent de Dr Memory sous Linux s’appele Valgrind. Pour d´ etecter
d’o` u vient la fuite, on peut utiliser l’instruction :
R -d ’valgrind --leak-check=full’
> dyn.load("memoire.so")
> .C("testmemoire",10000L,3.0)
> q()
Dans la sortie de valgrind, il faut alors chercher les erreurs indiqu´ ees ainsi
que les num´ eros de ligne du code source de memoire.cpp. Les instructions
ci-dessous pourront vous donner d’autres types d’erreurs affich´ ees par R, et
qui seront d´ etect´ ees par Valgrind :
> # Fonctionne une seule fois!
> # Après R plante avec un: "caught segfault":
> .C("testmemoire",10000L,c(3.0,5.0))
> # R se ferme: "invalid next size":
> .C("testmemoire",10000,c(3.0,5.0))
> # R se ferme: "std::bad_alloc":
> .C("testmemoire",10^12,c(3.0,5.0))
> # Fonctionne alors que ptr2 n’est plus défini:
> .C("testmemoire",10000L,as.double(1:10))
Précédent

- 329/701

Suivant