Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

Крэш программы при работе с кострукторами - C++

28.10.2015, 12:59. Просмотров 205. Ответов 9
Метки нет (Все метки)

Пробую разобраться с конструкторами. Увы пока крэш ( Подскажите
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;
struct C {
    char* ch;
    int value;
    C():ch(new char[20]()){}
    C(char*, int);
};
C::C(char*che, int v) {
    
    strcpy(C::ch, che);
    C::value = v;
}
int main() {
    int v = 100;
    char*che = new char[20]();
    strcpy(che,"BOZO_RETORT");
 
    C temp(che, v);
    cout << temp.ch << " " << temp.value << endl;
    system("PAUSE");
    return 0;
}

http://www.cyberforum.ru/cpp-beginners/thread1787194.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 12:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Крэш программы при работе с кострукторами (C++):

Крэш программы на одном ПК
Доброго времени суток, в с++ я пока только осваиваю азы и т.п. Серверное...

Не является внутренней или внешней командой - ошибка не при компиляции а при работе программы
В VS скомпилировал код #include &lt;iostream&gt; using namespace std; int main()...

Ошибка при работе программы
Помогите найти ошибку Код: #include &lt;iostream&gt; #include &lt;windows.h&gt; ...

Ошибка при работе программы
Здравствуйте! У меня такая проблема, вылетает программа. Она работает,...

Пауза при работе программы.
Кроме system(&quot;pause&quot;) есть еще команды, которыми можна приостановить работу...

9
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
28.10.2015, 13:03 #2
anti-k, внутри методов не нужно использовать операцию разрешения контекста и имя класса
Цитата Сообщение от anti-k Посмотреть сообщение
C++
1
2
strcpy(C::ch, che);
C::value = v;
C++
1
2
strcpy(ch, che);
value = v;
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
28.10.2015, 13:06 #3
Цитата Сообщение от anti-k Посмотреть сообщение
Увы пока крэш
Память надо выделять во всех конструкторах, а не только в конструкторе по умолчанию.
Код - жесть.
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
28.10.2015, 13:22  [ТС] #4
Tulosba, Так это мой первый конструктор на С++. За то что помогли разобраться назову его в вашу честь Tulosba!(И структуру понятно тоже ) А зачем в каждом конструкторе выделять память? Вроде как бы должен был сработать первый конструктор, затем второй, короче запутался я. А а таком случае?
C++
1
2
3
4
5
6
7
8
9
10
11
struct C {
    char* ch=new char[20];
    int value;
    C():ch(),value(0){}
    C(char*, int);
};
C::C(char*che, int v) {
    
    strcpy(C::ch, che);
    C::value = v;
}
Добавлено через 28 секунд
Kerry_Jr, мое почтение!
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.10.2015, 13:29 #5
Цитата Сообщение от anti-k Посмотреть сообщение
А зачем в каждом конструкторе выделять память? Вроде как бы должен был сработать первый конструктор, затем второй
Нет. С чего бы?
Можно сделать через делигирующие конструкторы, но это только в С++11 (как и инициализация непосредственно в классе, которая у вас в листинге).
C++
1
2
3
4
C::C(char*che, int v) : C() {
    value = v;
    strcpy(ch, che);
}
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
28.10.2015, 13:39  [ТС] #6
ForEveR, Так решил по недоумству конечно, но роль в этом сыграло то что первый конструктор как бэ инлайн, Второй перегруженный и вызван из мэйн. Мне показалось что встроенный конструктор работает вместо конструктора по умолчанию. visual 2012 вообще ругается на такое
C++
1
2
3
4
5
6
struct C {
    char* ch=new char[20];
    int value=0;
    C():ch(),value(){}
    C(char*, int);
};
а вот 2015-ый(в котором сеньор Kerry_Jr помог немного разобраться ) любезно все глотает .
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
28.10.2015, 13:49 #7
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Цитата Сообщение от anti-k Посмотреть сообщение
Так решил по недоумству конечно
Всё же почитай литературу, а то обучение путем проб и ошибок не самый лучший способ освоить язык.
По текущему коду:
1. Ручное динамическое выделение памяти не надо.
2. strcpy() - сишное наследие, не надо.
3. Используй std::string (вместо char*).
Проблем будет на порядок меньше.
1
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
28.10.2015, 13:56  [ТС] #8
Tulosba, Спасибо!в данный момент читаю Прата, его сверяю с Липманом ), все равно без проб и ошибок а никак. к char* отношусь с опаской, но увы так требует препод( Учитывая ваши замечания :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;
struct C {
    char* ch;// = new char[20];
    int value;
    //C():ch(),value(0){}
    C(char*, int);
};
C::C(char*che, int v) {
    ch = new char[20];
    strcpy(ch, che);
    value = v;
}
int main() {
    int v = 100;
    char*che = new char[20]();
    che="BOZO_RETORT";
 
    C temp(che, v);
    cout << temp.ch << " " << temp.value << endl;
    system("PAUSE");
       delete[]che;
       delete[]temp.ch;
    return 0;
}
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
28.10.2015, 14:00 #9
anti-k, а почему в конструкторе через strcpy, а в main обычное присваивание через =? Это уже ошибка (утечка памяти).
Подумай, что будет, если строка >=20 байт.
Если добавил конструктор, то вероятно надо подумать и о деструкторе, копирующем конструкторе, копирующем операторе присваивания (для c++11 и выше ещё о перемещающем конструкторе и операторе перемещающего присваивания). В современной интерпретации это называется "Правило пяти".
1
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
28.10.2015, 14:10 #10
anti-k, зачем динамическое выделение памяти, если всегда одно и то же количество символов? Да и в main вот это
C++
1
2
char*che = new char[20](); // выделили и не освободили
che="BOZO_RETORT"; // присвоили новый адрес
утечка памяти.
1
28.10.2015, 14:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2015, 14:10
Привет! Вот еще темы с решениями:

Создание массива при работе программы
Суть такова при работе программы я получу 2 числа (M и N), заранее я их не...

При работе программы выдаёт ошибку
Ошибка: Expression: c &gt;= -1 &amp;&amp; c &lt;= 255. Что должна делать программа?: Дана...

Краш программы при работе с tinyxml2
Привет всем. Использую tinyxml2, пытаюсь из этого xml документа: &lt;response...

Вылет при работе программы с неизвестной ошибкой
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main()...


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

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

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