2016-12-05 6 views
0

Я пытаюсь присвоить значение строковой переменной другой строковой переменной структуры. Но gdb дает ошибку времени выполнения. Ошибка следующая: Программный сигнал SIGSEGV, ошибка сегментации. 0xb7f7c8f8 в станд :: струнной :: правопреемника (станд :: строка сопзЬ &)() из /usr/lib/i386-linux-gnu/libstdc++.so.6Как присвоить значение строковой переменной строковой переменной структуры в C++?

программы

Мой C++ является:

#include<iostream> 
#include<stdlib.h> 
#include<string> 
typedef long unsigned int LUI; 
using namespace std; 
struct graph { 
    string string_node; 
    LUI node; 
    struct graph *link; 
}; 
struct graph *abc[30]; 
struct graph *t; 
string x; 
int main() { 
    t = (struct graph *) malloc(sizeof(struct graph *)); 
    x = "abc"; 
    t->string_node = x; 
    t->link = NULL; 
    abc[0] = t; 
    cout << "Value is " << abc[0]->string_node << endl; 
    cout << "end"; 

    return 0; 
} 

Пожалуйста, помогите мне сохранить значение x в t-> string_node. Заранее спасибо ..

+0

Вы прочитали урок cpp перед тем, как попробовать? вы действительно должны. http://www.learncpp.com/ – Stargateur

+1

Используйте 'new' для правильного выделения памяти. –

ответ

2
t = (struct graph *) malloc(sizeof(struct graph *)); 

- класс. Он содержит классы C++, в частности, он содержит std::string.

Все классы C++ должны быть построены в динамической области с использованием оператора new. Они не могут быть построены с помощью библиотечной функции C malloc(), которая абсолютно ничего не знает о C++-классах. Это приводит к неопределенному поведению (не говоря уже о том, что ваш размер malloc-ed неправильный, так или иначе).

Теперь, когда вы пишете код на Си ++, вам нужно полностью забыть, что malloc(), realloc() и free() когда-либо существовали, и всегда использовать new и delete.

1

Ваша проблема заключается в том, что вы выделения struct с malloc, но struct не только (просто старые данные) членов POD: он имеет std::string член, а std::string объекты ожидают быть построены. Простое выделение памяти для него с помощью malloc не вызовет конструктор std::string, и, следовательно, попытка взаимодействия с этим std::string позже приведет к неопределенному поведению, так как этот объект находится в плохом состоянии.

Вы должны вместо этого использовать new выделить свой struct, и это будет правильно распределять память и вызывать конструктор по умолчанию для каждого члена. (С другой стороны, вы должны освободить эту память с delete вместо free правильно вызвать деструктор каждого члена.)

В качестве альтернативы можно использовать "placement new" построить объект в памяти вы уже выделены, но это не то, что вам обычно нужно делать.

+0

Спасибо ... Он работает после использования нового ... –

Смежные вопросы