9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
1

Std::string в union -> segmentation fault

17.05.2015, 23:11. Показов 2324. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2015, 23:11
Ответы с готовыми решениями:

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

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

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

Segmentation fault
не могу скинуть код по личным причинам. я использую строковые операторы strcmp, strcpy. выводит...

11
Эксперт С++
4981 / 3088 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
17.05.2015, 23:27 2
Покажи пример при котором "падает".
0
17110 / 9129 / 2236
Регистрация: 30.01.2014
Сообщений: 15,916
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
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
17.05.2015, 23:49  [ТС] 4
DrOffset, отлично, это работает. А разве нельзя вызвать деструктор string в деструкторе ~value() ?
0
Эксперт С++
4981 / 3088 / 456
Регистрация: 10.11.2010
Сообщений: 11,165
Записей в блоге: 10
17.05.2015, 23:49 5
OrmaJever, а в чём смысл запихивать std::string в union? Экономия памяти?
0
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
17110 / 9129 / 2236
Регистрация: 30.01.2014
Сообщений: 15,916
18.05.2015, 00:08 7
Цитата Сообщение от OrmaJever Посмотреть сообщение
А разве нельзя вызвать деструктор string в деструкторе ~value() ?
Можно, но только в том случае, если он действительно там сохранен (а не, int например). Если там на самом деле int, то при вызове деструктора String будет UB. Из деструктора самого union ты никак это не определишь, поэтому выход один: вызывать извне с предварительной проверкой.

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
если волшебное слово union заменить на struct
А ты в курсе про то, что union хранит всегда только какой-то один из своих членов?
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:11  [ТС] 8
DrOffset, в общем я понял, перед очисткой нужно убедиться что там именно этот класс задействован, это я понял, дальше буду уже сам крутиться. У меня снаружи есть переменная которая содержит какой тип записан в union от неё и буду отталкиваться
0
17110 / 9129 / 2236
Регистрация: 30.01.2014
Сообщений: 15,916
18.05.2015, 00:13 9
Цитата Сообщение от OrmaJever Посмотреть сообщение
У меня снаружи есть переменная которая содержит какой тип записан в union от неё и буду отталкиваться
Да - это правильно.
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:13  [ТС] 10
Цитата Сообщение от DrOffset Посмотреть сообщение
А ты в курсе про то, что union хранит всегда только какой-то один из своих членов?
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет сумма всех свойств. Я это к тому написал что экономия существенная.
0
17110 / 9129 / 2236
Регистрация: 30.01.2014
Сообщений: 15,916
18.05.2015, 00:16 11
Цитата Сообщение от OrmaJever Посмотреть сообщение
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет самма всех свойств. Я это к тому написал что экономия существенная.
Ок. Просто нужно было удостовериться, что ты понимаешь на что идешь
Вообще посмотри boost::variant. Он как раз эту задачу решает.
0
2760 / 1914 / 569
Регистрация: 05.06.2014
Сообщений: 5,569
18.05.2015, 00:26 12
Цитата Сообщение от OrmaJever Посмотреть сообщение
castaway, вообще да. Но это я показал не весь union, и string там ещё не самый крупный (sizeof показывает 4б)
Думается мне, json все же правильнее делать через наследование и виртуальные функции. Алсо, раз уж делаете не через наследование, то в мап и вектор можно класть JType, а не указатель на него.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2015, 00:26
Помогаю со студенческими работами здесь

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

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

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

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru