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

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

Войти
Регистрация
Восстановить пароль
 
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

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

28.10.2015, 12:59. Просмотров 198. Ответов 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 12:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Крэш программы при работе с кострукторами (C++):

Односвязный список. Крэш программы при выводе - C++
Доброго времени суток, господа. Извиняюсь за повторную тему (вчера такую же создавал с другим вопросом, но не смог найти её :( ) Проблема...

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

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

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

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

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

9
Kerry_Jr
Модератор
Эксперт PHP
2209 / 2005 / 702
Регистрация: 14.05.2014
Сообщений: 5,870
Записей в блоге: 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
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.10.2015, 13:06 #3
Цитата Сообщение от anti-k Посмотреть сообщение
Увы пока крэш
Память надо выделять во всех конструкторах, а не только в конструкторе по умолчанию.
Код - жесть.
1
anti-k
227 / 75 / 23
Регистрация: 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
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 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 / 23
Регистрация: 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
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.10.2015, 13:49 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от anti-k Посмотреть сообщение
Так решил по недоумству конечно
Всё же почитай литературу, а то обучение путем проб и ошибок не самый лучший способ освоить язык.
По текущему коду:
1. Ручное динамическое выделение памяти не надо.
2. strcpy() - сишное наследие, не надо.
3. Используй std::string (вместо char*).
Проблем будет на порядок меньше.
1
anti-k
227 / 75 / 23
Регистрация: 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
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.10.2015, 14:00 #9
anti-k, а почему в конструкторе через strcpy, а в main обычное присваивание через =? Это уже ошибка (утечка памяти).
Подумай, что будет, если строка >=20 байт.
Если добавил конструктор, то вероятно надо подумать и о деструкторе, копирующем конструкторе, копирующем операторе присваивания (для c++11 и выше ещё о перемещающем конструкторе и операторе перемещающего присваивания). В современной интерпретации это называется "Правило пяти".
1
Kerry_Jr
Модератор
Эксперт PHP
2209 / 2005 / 702
Регистрация: 14.05.2014
Сообщений: 5,870
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Краш программы при работе с tinyxml2 - C++
Привет всем. Использую tinyxml2, пытаюсь из этого xml документа: &lt;response list=&quot;true&quot;&gt; &lt;user&gt; &lt;id&gt;12345678&lt;/id&gt; ...

При работе программы выдаёт ошибку - C++
Ошибка: Expression: c &gt;= -1 &amp;&amp; c &lt;= 255. Что должна делать программа?: Дана строка. Удалить слова, не содержащие букв «A», «В», «Е»....

Создание массива при работе программы - C++
Суть такова при работе программы я получу 2 числа (M и N), заранее я их не знаю. Мне надо создать двумерный массив (если это возможно)...

Вылет при работе программы с неизвестной ошибкой - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { int x=0; // хранит количество слов в строке ...


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

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

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