Bonjour ,

La dernière fois, un collègue me parlait d'erreur de segmentation et m'a décrit l'exemple suivant :


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
#include <iostream>
#include <string>
 
// Exemple de code qui créé une erreur de segmentation.
 
std::string &calcul(int valeur)
{
        valeur++;
        std::string retour = std::to_string(valeur);
        return retour;
}
 
int main()
{
        std::cout << calcul(3) << std::endl;
}
Lors de d'exécution ce code produit une erreur de segmentation : Segmentation fault (core dumped).

Dans un premier temps, voici ce que je pense, concernant l'origine de l'erreur.

La fonction calcul retourne une référence sur un type string.
Dans cette fonction, la variable retour (type string) est déclarée et est renvoyée.
Or, un string correspondant à un tableau de type char, c'est donc la référence vers le premier élément du tableau qui est renvoyée (type char&).
La variable retour est une variable locale donc stockée dans la heap et cette adresse n'existe plus dès que l'on sort de la fonction.
Ainsi lorsque la fonction est appelée dans main, la case mémoire est invalide ce qui provoque l'erreur de segmentation.

Mon collègue m'a également dit que cette erreur pouvait être corrigé via l'usage du mot clé const. Le problème est que je ne vois pas bien comment utilisé const dans mon code pour corriger cette erreur.
J'ai bien essayé de l'utiliser dans la définition de ma fonction et le type de retour de la sorte :
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
#include <iostream>
#include <string>
 
// Exemple de code qui créé une erreur de segmentation.
 
const std::string &calcul(int valeur)
{
        valeur++;
        const std::string retour = std::to_string(valeur);
        return retour;
}
 
int main()
{
        std::cout << calcul(3) << std::endl;
}
Cependant, j'obtiens toujours l'erreur de segmentation. J'ai l'impression que l'idée est faire en sorte que la référence reste en vie en utilisant const mais je ne vois pas bien comment faire.
Auriez-vous des pistes à me suggérer svp ?