Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

Std::string в union -> segmentation fault - C++

17.05.2015, 23:11. Просмотров 511. Ответов 11
Метки нет (Все метки)

Если создать простой класс с union'ом внутри которого есть пользовательский тип
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
using std::string;
class A {
public:
    A( string str ) { val.String = str; }
    union value
    {
        int                         Int;
        string                      String;
 
        value(){};
        ~value(){};
    } val; // записаное значение
};
и затем его вызвать
C++
1
A a("string");
То программа падает на конструкторе, если присваивать значение инту то всё нормально. Что-то мне подсказывает что нужно как-то инстализировать класс string внутри union, но я не могу понять как?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2015, 23:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Std::string в union -> segmentation fault (C++):

string segmentation fault - C++
Доброго времени суток! Подскажите в чем может быть проблема? string str; int main(int argc, char const *argv) { ...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Segmentation fault - C++
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса: GeneticEngine, FitnessFunction. Класс FitnessFunction...

Segmentation fault - C++
Всем привет. Пишу быдлокод для лабы в универе. Мне по определенному алгоритму необходимо получить из одного поколения особей, новое. ...

Segmentation fault :( - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{ int id; char name; }; struct first{

Segmentation fault - C++
Доброго времени суток. Есть 2 класса. object class object{ void (*f)(object*); public: void setFunc(void...

11
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
17.05.2015, 23:27 #2
Покажи пример при котором "падает".
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
17.05.2015, 23:29 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
OrmaJever,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
using std::string;
class A {
public:
    A( string str ) { val.String = str; }
    union value
    {
        int                         Int;
        string                      String;
 
        value() : String() {}
        ~value(){ }
    } val; // записаное значение
};
Только имей в виду, что деструктор для String нужно будет вызывать вручную.
2
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
17.05.2015, 23:49  [ТС] #4
DrOffset, отлично, это работает. А разве нельзя вызвать деструктор string в деструкторе ~value() ?
0
castaway
Эксперт С++
4924 / 3032 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
17.05.2015, 23:49 #5
OrmaJever, а в чём смысл запихивать std::string в union? Экономия памяти?
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:03  [ТС] #6
castaway, вообще да. Но это я показал не весь union, и string там ещё не самый крупный (sizeof показывает 4б)
C++
1
2
3
4
5
6
7
8
        struct value
        {
            int                         Int;
            bool                        Bool;
            double                      Double;
            string                      String;
            std::map< string, JType * > Object;
            std::vector< JType * >      Array;
std::map - 24б, и в целом размер обьеденения - 24б, а если волшебное слово union заменить на struct то - 56б. А поскольку его копий может быть много и даже очень много то это значительная экономия.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
18.05.2015, 00:08 #7
Цитата Сообщение от OrmaJever Посмотреть сообщение
А разве нельзя вызвать деструктор string в деструкторе ~value() ?
Можно, но только в том случае, если он действительно там сохранен (а не, int например). Если там на самом деле int, то при вызове деструктора String будет UB. Из деструктора самого union ты никак это не определишь, поэтому выход один: вызывать извне с предварительной проверкой.

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
если волшебное слово union заменить на struct
А ты в курсе про то, что union хранит всегда только какой-то один из своих членов?
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:11  [ТС] #8
DrOffset, в общем я понял, перед очисткой нужно убедиться что там именно этот класс задействован, это я понял, дальше буду уже сам крутиться. У меня снаружи есть переменная которая содержит какой тип записан в union от неё и буду отталкиваться
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
18.05.2015, 00:13 #9
Цитата Сообщение от OrmaJever Посмотреть сообщение
У меня снаружи есть переменная которая содержит какой тип записан в union от неё и буду отталкиваться
Да - это правильно.
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:13  [ТС] #10
Цитата Сообщение от DrOffset Посмотреть сообщение
А ты в курсе про то, что union хранит всегда только какой-то один из своих членов?
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет сумма всех свойств. Я это к тому написал что экономия существенная.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
18.05.2015, 00:16 #11
Цитата Сообщение от OrmaJever Посмотреть сообщение
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет самма всех свойств. Я это к тому написал что экономия существенная.
Ок. Просто нужно было удостовериться, что ты понимаешь на что идешь
Вообще посмотри boost::variant. Он как раз эту задачу решает.
0
Renji
2113 / 1472 / 346
Регистрация: 05.06.2014
Сообщений: 4,265
18.05.2015, 00:26 #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
castaway, вообще да. Но это я показал не весь union, и string там ещё не самый крупный (sizeof показывает 4б)
Думается мне, json все же правильнее делать через наследование и виртуальные функции. Алсо, раз уж делаете не через наследование, то в мап и вектор можно класть JType, а не указатель на него.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2015, 00:26
Привет! Вот еще темы с ответами:

Segmentation fault - C++
Пишу лабу для универа. В общем необходимо использовать только свои функции, никаких, str... подобных функций использовать нельзя. ...

Segmentation fault - C++
Здравствуйте. Нужно динамически получить такое: char * a = {&quot;abc&quot;, NULL}; Пробую: char ** a; a = new char*; a = new char; ......

Segmentation fault - C++
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача отсортировать данные по одному из параметров, но...

Segmentation fault - C++
Почему при таком варианте происходит Segmentation fault? vec3f trace(const Scene&amp; scene, const Ray&amp; ray) { const RenderObject*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru