Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
28.10.2015, 12:59     Крэш программы при работе с кострукторами #1
Пробую разобраться с конструкторами. Увы пока крэш ( Подскажите
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;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1858 / 1654 / 577
Регистрация: 14.05.2014
Сообщений: 4,750
Записей в блоге: 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;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.10.2015, 13:06     Крэш программы при работе с кострукторами #3
Цитата Сообщение от anti-k Посмотреть сообщение
Увы пока крэш
Память надо выделять во всех конструкторах, а не только в конструкторе по умолчанию.
Код - жесть.
anti-k
 Аватар для anti-k
226 / 74 / 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, мое почтение!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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);
}
anti-k
 Аватар для anti-k
226 / 74 / 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 помог немного разобраться ) любезно все глотает .
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.10.2015, 13:49     Крэш программы при работе с кострукторами #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от anti-k Посмотреть сообщение
Так решил по недоумству конечно
Всё же почитай литературу, а то обучение путем проб и ошибок не самый лучший способ освоить язык.
По текущему коду:
1. Ручное динамическое выделение памяти не надо.
2. strcpy() - сишное наследие, не надо.
3. Используй std::string (вместо char*).
Проблем будет на порядок меньше.
anti-k
 Аватар для anti-k
226 / 74 / 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;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.10.2015, 14:00     Крэш программы при работе с кострукторами #9
anti-k, а почему в конструкторе через strcpy, а в main обычное присваивание через =? Это уже ошибка (утечка памяти).
Подумай, что будет, если строка >=20 байт.
Если добавил конструктор, то вероятно надо подумать и о деструкторе, копирующем конструкторе, копирующем операторе присваивания (для c++11 и выше ещё о перемещающем конструкторе и операторе перемещающего присваивания). В современной интерпретации это называется "Правило пяти".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2015, 14:10     Крэш программы при работе с кострукторами
Еще ссылки по теме:

Крэш программы на одном ПК C++
Ошибка при работе программы C++
"Разделение" процессов при работе программы C++

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

Или воспользуйтесь поиском по форуму:
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1858 / 1654 / 577
Регистрация: 14.05.2014
Сообщений: 4,750
Записей в блоге: 1
Завершенные тесты: 5
28.10.2015, 14:10     Крэш программы при работе с кострукторами #10
anti-k, зачем динамическое выделение памяти, если всегда одно и то же количество символов? Да и в main вот это
C++
1
2
char*che = new char[20](); // выделили и не освободили
che="BOZO_RETORT"; // присвоили новый адрес
утечка памяти.
Yandex
Объявления
28.10.2015, 14:10     Крэш программы при работе с кострукторами
Ответ Создать тему
Опции темы

Текущее время: 23:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru