2009-05-13 2 views
1

Должно быть что-то очевидное, я не понимаю о C++ с этим.Stange seg fault при использовании + = со строками

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! 
    ... 
} 

в GDB, когда я "печать" имя файла в начале функции я получаю: (Const строки &) @ 0x9505f08: {статические НСС = 4294967295, _M_dataplus = {> = {< __gnu_cxx :: new_allocator> = {},}, _M_p = 0x950a8e4 "../config/pythonFile.py"}}

Какая черта, как неправильное имя файла, так что .append() работает и + = не делает ?! Что-то странное в перегруженной функции + = в C++?

г ++ версии 3.4.6

+1

Перерыв в оператор + = функция, чтобы увидеть, в какую фактическую строку он врезался. –

+0

Что произойдет, если вы измените порядок вызовов для добавления и + =? Или вы пытались их по одному за раз? –

+0

@harper умирает на + = и никогда не попадает в .append – Alex

ответ

4

Может быть, это связано с тем, как вы строите "каталог" здесь

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

ли RFIND как-то неудачу? Если rfind не удалось, он вернет std :: npos, как указано here. Я не уверен, каким будет поведение, если вы передали npos в конструктор строк. Это может зависеть от платформы.

Это не ответит, почему «append» будет работать, и «+ =» сработает. У вас может также быть какое-то кучное повреждение (возможно, вызванное npos и строкой C, переданной в конструктор выше), и, возможно, когда + = называется новой памятью, необходимо выделить. При добавлении по какой-либо причине может не потребоваться выделение новой памяти.

В любом случае было бы разумно добавить чек для npos.

+0

Я подозреваю, что вы правы, я пытаюсь отслеживать повреждение памяти, используя valgrind. – Alex

+0

Вы выигрываете файл cookie. Одна из строк не была правильно размещена в библиотеке. Тот факт, что + = выделяет кучу, по-видимому, вызывает проблему. – Alex

1

Я не могу воспроизвести вашу проблему. Файл ниже работает здесь с г ++:

#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; 

} 

Выход:

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