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

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

Восстановить пароль Регистрация
 
Tohitch
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 10
10.08.2014, 00:36     Конструктор копирования, аварийное завершение на этапе исполнения #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
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 то запускается конструктор по умолчанию а затем конструктор копирования или только конструктор копирования?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2014, 00:36     Конструктор копирования, аварийное завершение на этапе исполнения
Посмотрите здесь:

C++ Аварийное завершение программы
abnormal program termination (аварийное завершение программы) C++
Аварийное завершение программы, ошибка в функции вывода. C++
Аварийное завершение... почему? C++
C++ Мой код вызывает аварийное завершение компилятора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
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]; 
    } 
}
Исправил выше. Суть в том, что до конструктора копирования объект не существует, следовательно проверки, которые я убрал, были лишние. А реализация, которая была у тебя подходит для оператора присваивания.
А вообще смотри тут, там есть законченный пример.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 00:43     Конструктор копирования, аварийное завершение на этапе исполнения #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tohitch, конструктор копирования создает НОВЫЙ объект. Т.е. удаления в 24 строке быть не должно. Т.к. получается попытка освободить память, которая и не была выделена вовсе.
В 59 строке - только конструктор копирования вызывается. Начинайте пользоваться отладчиком, чтобы не задавать такие вопросы.
Tohitch
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 10
10.08.2014, 01:03  [ТС]     Конструктор копирования, аварийное завершение на этапе исполнения #4
Tulosba, спасибо. Извиняюсь за глупые вопросы, я относительно недавно начал самостоятельно изучать с++ без особых познаний в программировании. Пытаюсь пройти до конца курс академии Шаг, но чем дальше тем сложнее и самому разобраться тяжело.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
10.08.2014, 01:28     Конструктор копирования, аварийное завершение на этапе исполнения #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. удаления в 24 строке быть не должно.
Не только удаления, но и сравнения тоже...
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.08.2014, 11:08     Конструктор копирования, аварийное завершение на этапе исполнения #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Не только удаления, но и сравнения тоже...
Угу. Я думаю, ТСу это должно бы стать понятным после фразы
Цитата Сообщение от Tulosba Посмотреть сообщение
конструктор копирования создает НОВЫЙ объект
Tohitch, ещё советую принять к сведению правило трёх. Т.о. для нормальной работы нужно ещё и оператор присваивания реализовать.
Yandex
Объявления
10.08.2014, 11:08     Конструктор копирования, аварийное завершение на этапе исполнения
Ответ Создать тему
Опции темы

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