Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Tohitch
1 / 1 / 0
Регистрация: 17.06.2014
Сообщений: 10
#1

Конструктор копирования, аварийное завершение на этапе исполнения - C++

10.08.2014, 00:36. Просмотров 303. Ответов 5
Метки нет (Все метки)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream.h>
#include <string.h>
 
class String{
   private:
   char *data;
   int max_length;
   public:
   String()
   {
        data=new char[20];
        max_length=20;
   }
   String(int i)
   {
       data = new char[i];
       max_length=i;
   }
    
   String(const String &s)
    {
        if (max_length < s.max_length)
        {
            delete [] data;
            data=new char[s.max_length];
            max_length=s.max_length;
         }
         for(int i=0;i<max_length;i++)
         {
              data[i]=s.data[i];
         }
    }
 
    String(const char *s)
    {
         max_length=strlen(s) + 1;
         data=new char[max_length];
         for(int i=0;i<max_length;i++)
         {
              data[i]=*(s+i);
         }
     }
     ~String()
     {
          delete [] data;
     }
     
     void Print(void)
     {
         cout<<data<<endl;
     }
};
 
void main()
{
    String S1("Hello world");
    S1.Print();
 
    String  S2=S1;
    S2.Print();
}
После начала выполнения программы на экран выводится надпись "Hello world" с объекта S1, а когда приходит время распечатать объект S2 происходит аварийное завершение программы. Помогите пожалуйста разобраться в чем дело.
И еще вопрос, если можно, когда мы создаем объект S2 и инициализируем его объектом S1 то запускается конструктор по умолчанию а затем конструктор копирования или только конструктор копирования?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 00:36
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Конструктор копирования, аварийное завершение на этапе исполнения (C++):

Аварийное завершение программы
#include &quot;B.h&quot; #include &quot;D1.h&quot; #include &quot;D2.h&quot; #include &lt;iostream&gt;...

Аварийное завершение программы
Программа завершается аварийно, но в файл записывает требуемую информацию....

Аварийное завершение... почему?
Код рабочий, но если элементов больше 4, тогда программа аварийно завершает...

Ошибка. Аварийное завершение программы.
Товарищи,есть функция.. cor find(cor start) { cor buf=start; cor pv=NULL;...

Аварийное завершение работы программы
1)программа работает правильно но когда нажимаю ентер (после этого она должна...

Задание размера массива на этапе исполнения
Qt 5.4.1, MinGW 32bit... спокойно кушает такой код: #include &lt;iostream&gt; ...

5
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.08.2014, 00:42 #2
Цитата Сообщение от Tohitch Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
String(const String &s) 
    : data(0) 
{ 
    data=new char[s.max_length]; 
    max_length=s.max_length; 
 
    for(int i=0;i<max_length;i++) 
    { 
        data[i]=s.data[i]; 
    } 
}
Исправил выше. Суть в том, что до конструктора копирования объект не существует, следовательно проверки, которые я убрал, были лишние. А реализация, которая была у тебя подходит для оператора присваивания.
А вообще смотри тут, там есть законченный пример.
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 00:43 #3
Лучший ответ Сообщение было отмечено Tohitch как решение

Решение

Tohitch, конструктор копирования создает НОВЫЙ объект. Т.е. удаления в 24 строке быть не должно. Т.к. получается попытка освободить память, которая и не была выделена вовсе.
В 59 строке - только конструктор копирования вызывается. Начинайте пользоваться отладчиком, чтобы не задавать такие вопросы.
1
Tohitch
1 / 1 / 0
Регистрация: 17.06.2014
Сообщений: 10
10.08.2014, 01:03  [ТС] #4
Tulosba, спасибо. Извиняюсь за глупые вопросы, я относительно недавно начал самостоятельно изучать с++ без особых познаний в программировании. Пытаюсь пройти до конца курс академии Шаг, но чем дальше тем сложнее и самому разобраться тяжело.
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.08.2014, 01:28 #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. удаления в 24 строке быть не должно.
Не только удаления, но и сравнения тоже...
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
10.08.2014, 11:08 #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Не только удаления, но и сравнения тоже...
Угу. Я думаю, ТСу это должно бы стать понятным после фразы
Цитата Сообщение от Tulosba Посмотреть сообщение
конструктор копирования создает НОВЫЙ объект
Tohitch, ещё советую принять к сведению правило трёх. Т.о. для нормальной работы нужно ещё и оператор присваивания реализовать.
1
10.08.2014, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2014, 11:08
Привет! Вот еще темы с решениями:

Рекурсивная функция/аварийное завершение программы
Всем привет. Задание такое: есть вырожение Нужно найти такое х, с погрешность...

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

Мой код вызывает аварийное завершение компилятора
Я использую компилятор Borland C++ 5.1 Выполнение след. кода вызывает...

Аварийное завершение программы (Прата, глава 12, string1)
Доброго времени суток. Не могу понять, из-за чего происходит аварийное...


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

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

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