С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241

Std::string в union -> segmentation fault

17.05.2015, 23:11. Показов 2687. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2015, 23:11
Ответы с готовыми решениями:

string segmentation fault
Доброго времени суток! Подскажите в чем может быть проблема? 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
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

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

11
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.05.2015, 23:27
Покажи пример при котором "падает".
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.05.2015, 23:29
Лучший ответ Сообщение было отмечено 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  [ТС]
DrOffset, отлично, это работает. А разве нельзя вызвать деструктор string в деструкторе ~value() ?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.05.2015, 23:49
OrmaJever, а в чём смысл запихивать std::string в union? Экономия памяти?
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:03  [ТС]
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.05.2015, 00:08
Цитата Сообщение от 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  [ТС]
DrOffset, в общем я понял, перед очисткой нужно убедиться что там именно этот класс задействован, это я понял, дальше буду уже сам крутиться. У меня снаружи есть переменная которая содержит какой тип записан в union от неё и буду отталкиваться
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.05.2015, 00:13
Цитата Сообщение от OrmaJever Посмотреть сообщение
У меня снаружи есть переменная которая содержит какой тип записан в union от неё и буду отталкиваться
Да - это правильно.
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.05.2015, 00:13  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
А ты в курсе про то, что union хранит всегда только какой-то один из своих членов?
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет сумма всех свойств. Я это к тому написал что экономия существенная.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.05.2015, 00:16
Цитата Сообщение от OrmaJever Посмотреть сообщение
ну да, я про это и писал, что так размер самого большого std::map, а если это будет структура или класс то будет самма всех свойств. Я это к тому написал что экономия существенная.
Ок. Просто нужно было удостовериться, что ты понимаешь на что идешь
Вообще посмотри boost::variant. Он как раз эту задачу решает.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.05.2015, 00:26
Цитата Сообщение от OrmaJever Посмотреть сообщение
castaway, вообще да. Но это я показал не весь union, и string там ещё не самый крупный (sizeof показывает 4б)
Думается мне, json все же правильнее делать через наследование и виртуальные функции. Алсо, раз уж делаете не через наследование, то в мап и вектор можно класть JType, а не указатель на него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2015, 00:26
Помогаю со студенческими работами здесь

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

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

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

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

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw std::logic_error(&quot;buf == nullptr&quot;); } if...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru