CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

C++ - Erreur de segmentation

rangerprice
rangerprice
Niveau 10
01 mars 2015 à 04:12:48

Voici le prototype de ma variable:

QFile* currentFile;

et voici, la définition de la variable

currentFile = new QFile();

j'ai pas d'érreur de segmentation, mais j'aimerais savoir pourquoi quand je remplace la définition par ça, j'ai une érreur de segmentation quand j'utilise ma variable:

QFile* currentFile = new QFile();

godrik
godrik
Niveau 30
01 mars 2015 à 05:34:28

besoin de voir plus de code.
mais de facon generql, => valgrind.

rangerprice
rangerprice
Niveau 10
01 mars 2015 à 23:38:14

bool Exotic::setCurrentFile(const QString &filePath)
{
    if (currentFile->fileName().isEmpty())
    {
        currentFile->close();
    }

    currentFile->setFileName(filePath);
    currentFile->open(QIODevice::ReadWrite);
    ui->editor->setPlainText(QString(currentFile->readAll()));

    return 0;
}

Voici la fonction qui utilise currentFile :hap:

godrik
godrik
Niveau 30
01 mars 2015 à 23:47:16

Il faut un code complet pour pouvoir diagnostiquer un probleme comme ca.

rangerprice
rangerprice
Niveau 10
02 mars 2015 à 18:04:29

Mes deux fichiers:

Exotic.h: http://pastebin.com/BNpeGkeS
Exotic.cpp: http://pastebin.com/73GYpk9Y

[denshaotoko]
[denshaotoko]
Niveau 25
02 mars 2015 à 18:50:32

lorsque tu as des erreurs de segmentation, comme dit godrik, compile avec le flag de debug -g et ensuite lance valgrind ça te dira à quelle ligne tu fais une tentative d'accès illégale

sinon pour revenir à ton sujet initial, quand tu fais ça:

QFile* currentFile;
currentFile = new QFile();

tu déclares un nouveau pointeur currentFile (en plus de l'attribut currentFile de ton instance courante, mais il s'agit bien de deux variables différentes malgré le nom commun)

donc tu as currentFile, le pointeur que tu viens de crée (ce pointeur currentFile sera détruit une fois que tu seras sorti du bloc courant)
et this->currentFile le currentFile de l'instance courante

ensuite tu alloues dynamiquement un QFile dont l'adresse est affecté dans ton attribut currentFile (donc this->currentFile et non dans le pointeur currentFile que tu as déclaré précédemment)

donc, currentFile est nullptr et this->currentFile est bien alloué, donc il n'y aura pas segfault par la suite

par contre, dans le deuxieme cas

QFile* currentFile = new QFile();

ici this->currentFile sera nullptr, car tu alloues dans une nouveau pointeur qui ne sera plus accessible quand tu sortiras du bloc courant, donc ici tu auras une fuite mémoire en plus d'un segfault

Message édité le 02 mars 2015 à 18:51:22 par [denshaotoko]
rangerprice
rangerprice
Niveau 10
03 mars 2015 à 01:04:56

Le 02 mars 2015 à 18:50:32 [DenshaOtoko] a écrit :
lorsque tu as des erreurs de segmentation, comme dit godrik, compile avec le flag de debug -g et ensuite lance valgrind ça te dira à quelle ligne tu fais une tentative d'accès illégale

sinon pour revenir à ton sujet initial, quand tu fais ça:

QFile* currentFile;
currentFile = new QFile();

tu déclares un nouveau pointeur currentFile (en plus de l'attribut currentFile de ton instance courante, mais il s'agit bien de deux variables différentes malgré le nom commun)

donc tu as currentFile, le pointeur que tu viens de crée (ce pointeur currentFile sera détruit une fois que tu seras sorti du bloc courant)
et this->currentFile le currentFile de l'instance courante

ensuite tu alloues dynamiquement un QFile dont l'adresse est affecté dans ton attribut currentFile (donc this->currentFile et non dans le pointeur currentFile que tu as déclaré précédemment)

donc, currentFile est nullptr et this->currentFile est bien alloué, donc il n'y aura pas segfault par la suite

par contre, dans le deuxieme cas

QFile* currentFile = new QFile();

ici this->currentFile sera nullptr, car tu alloues dans une nouveau pointeur qui ne sera plus accessible quand tu sortiras du bloc courant, donc ici tu auras une fuite mémoire en plus d'un segfault


QFile* currentFile;

Alors c'est inutile de déclarer currentFile, vu que j'utilise this->currentFile et pas l'autre :question:

Dans le deuxième cas, pourquoi this->currentFile serait inaccessible à la sortie du bloc courant ? j'ai pourtant faire une allocation dynamique alors ça devrait pas être limité par la porté du bloc, mais ça devrait attendre que j'utilise l'opérateur delete, non :question:

godrik
godrik
Niveau 30
03 mars 2015 à 02:31:36

C'est pour ca que je voulais voir tout le code :)
Si tu utilise QFile* currentFile = new QFile(); dans le constructeur, alors tu as deux variable currentFile, une dans la structure et une dans la pile d'appel. C'est la variable de la pile d'appel que tu changes et pas la variable qui est dans la structure.

La memoire alloue dynamiquement est toujours disponible, mais tu n'as plus de pointeur dessus, donc elle est inaccessible.

rangerprice
rangerprice
Niveau 10
03 mars 2015 à 18:44:03

Et pourquoi quand je fais QFile* currentFile = new QFile(); il n'y aurait pas une érreur qui dit que je déclare une une variable déjà déclaré ? vu que ça a déjà été déclaré dans exotic.h :question:

C'est quoi la structure ? :question:

godrik
godrik
Niveau 30
03 mars 2015 à 18:55:00

non ce n'est pas une erreur par ce que la variable est scope differement. Ce le meme phenomene qui te permet d'avoir une variable globale et local qui ont le meme nom. La variable la plus "proche" est celle qui est reference. Tu peux toujours acceder a celle de la structure avec this->currentFile. Cela etant dit certains compilateur mettent un message d'avertissement quand une variable en cache une autre.

Et la structure c'est "Exotic" ici. (mmm, c'est une classe, mais bon c'est pas bien different en C++.)

Chocolayte
Chocolayte
Niveau 73
03 mars 2015 à 21:36:56

Faut se méfier des noms. Tu peux aussi retrouver ce cas de figure, si t'es tête en l'air ou que t'utilises une librairie quelconque :


// currentFile réfère à la variable déclarée dans la classe

void Exotic::setQFile(QFile argFile)
{
    currentFile = argFile;
}

// currentFile réfère à l'argument (variable locale)
// this->currentFile réfère à la variable déclarée dans la classe

void Exotic::setQFile(QFile currentFile)
{
    this->currentFile = currentFile;
}
rangerprice
rangerprice
Niveau 10
03 mars 2015 à 21:39:30

Ca y est j'ai compris, merci Godrik, et [DenshaOtoko] :hap:

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment