Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

Std::string в union -> segmentation fault

17.05.2015, 23:11. Просмотров 1026. Ответов 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
Ответы с готовыми решениями:

string segmentation fault
Доброго времени суток! Подскажите в чем может быть проблема? string...

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

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

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

Segmentation fault :(
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{...

11
castaway
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
17.05.2015, 23:27 #2
Покажи пример при котором "падает".
0
DrOffset
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,418
17.05.2015, 23:29 #3
Лучший ответ Сообщение было отмечено OrmaJever как решение

Решение

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
Эксперт С++
4927 / 3034 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 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
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,418
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
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,418
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
7586 / 4555 / 1103
Регистрация: 30.01.2014
Сообщений: 7,418
18.05.2015, 00:16 #11
Цитата Сообщение от OrmaJever Посмотреть сообщение
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет самма всех свойств. Я это к тому написал что экономия существенная.
Ок. Просто нужно было удостовериться, что ты понимаешь на что идешь
Вообще посмотри boost::variant. Он как раз эту задачу решает.
0
Renji
2156 / 1515 / 461
Регистрация: 05.06.2014
Сообщений: 4,394
18.05.2015, 00:26 #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
castaway, вообще да. Но это я показал не весь union, и string там ещё не самый крупный (sizeof показывает 4б)
Думается мне, json все же правильнее делать через наследование и виртуальные функции. Алсо, раз уж делаете не через наследование, то в мап и вектор можно класть JType, а не указатель на него.
0
18.05.2015, 00:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2015, 00:26

Segmentation fault
Доброго времени суток. Есть 2 класса. object class object{ void...

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

Segmentation fault
Почему при таком варианте происходит Segmentation fault? vec3f trace(const...


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

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

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