2009-05-13 7 views
1

Il doit y avoir quelque chose d'évident que je ne réalise pas à propos de C++ avec celui-ci.Erreur de segmente lors de l'utilisation de + = avec des chaînes

load(string & filename){ 

string command; 
char delimiter = '/'; 
size_t delimiterPos = filename.rfind(delimiter); 
string directory = string(filename.c_str(),delimiterPos); 
command = "import path "; 

    //want to add directory to end of command 
    string temp = command + "hello!"; // This works 
    command.append(directory); //This works! 
    command += directory; //This seg faults! 
    ... 
} 

dans GDB quand je nom de fichier "d'impression" au début de la fonction I get: (string const &) @ 0x9505f08: {npos statiques = 4294967295, _M_dataplus = {> = {< __gnu_cxx :: new_allocator> = {},}, _M_p = 0x950a8e4 "../config/pythonFile.py"}}

que diable, comment est le nom de fichier formaté correctement, de telle sorte que .append() fonctionne et + = ne pas ?! Quelque chose d'étrange dans la fonction surchargée + = en C++?

g ++ version 3.4.6

+1

Rompre dans l'opérateur + = fonction pour voir sur quelle ligne elle se bloque. –

+0

Que se passe-t-il si vous inversez l'ordre des appels à ajouter et + =? Ou les essayiez-vous un à la fois? –

+0

@harper meurt sur le + = et n'obtient jamais le .append – Alex

Répondre

4

Peut-être que cela a à voir avec la façon dont vous construisez "répertoire" ici

size_t delimiterPos = filename.rfind(delimiter); 
string directory = string(filename.c_str(),delimiterPos); 

Est-rfind échouez en quelque sorte? Si rfind échouait, il retournerait std :: npos comme spécifié here. Je ne suis pas sûr de ce que serait le comportement si vous passiez npos dans le constructeur de la chaîne. Cela peut dépendre de la plateforme. Cela ne répond pas pourquoi "append" fonctionnerait et "+ =" se bloquerait. Vous pouvez également avoir une sorte de corruption de tas (peut-être causée par la chaîne de caractères npos et C passée dans le constructeur ci-dessus) et peut-être quand + = est appelée nouvelle mémoire doit être allouée. Ajouter pour une raison quelconque peut ne pas avoir besoin d'allouer de nouvelle mémoire.

Dans tous les cas, il serait judicieux d'ajouter une vérification de npos.

+0

Je suppose que vous avez peut-être raison, j'essaie de localiser la corruption de la mémoire en utilisant valgrind. – Alex

+0

Vous gagnez le cookie. L'une des chaînes n'était pas correctement affectée dans la bibliothèque. Le fait que + = alloue le tas, apparemment, à l'origine du problème. – Alex

1

Je ne peux pas reproduire votre problème. Le fichier ci-dessous fonctionne ici avec g ++:

#include <string> 
#include <iostream> 

using namespace std; 

int main(int, char**) 
{ 
string filename("a/b/c/d"); 

string command; 
char delimiter = '/'; 
size_t delimiterPos = filename.rfind(delimiter); 
string directory = string(filename.c_str(),delimiterPos); 
command = "import path "; 

    //want to add directory to end of command 
    string temp = command + "hello!"; // This works 
    command.append(directory); //This works! 
    cout << command << endl; 

    command += directory; //This seg faults! 
    cout << command << endl; 

} 

Sortie:

$ g++ -o t t.cpp 
$ ./t 
import path a/b/c 
import path a/b/ca/b/c 
Questions connexes