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

Исключение Нарушение прав доступа при чтении - C++

Восстановить пароль Регистрация
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 405
23.04.2014, 11:52     Исключение Нарушение прав доступа при чтении #1
Есть такое задание - создать 2 класса
Класс -символ, c печататью свое знач и ответом на запрос о значении своего символьного поля;
класс строка- массив из 15 симв, умеющий выводить на печать зн своих элементов
вот
реализация
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
#include <iostream>
#include <string.h>
using namespace std;
class TSymb 
{//символ,c печатать свое зн и отв на запрос о знач св символьного поля; 
public:
TSymb(char c); 
void printCH();
protected:
  char ch;
};
TSymb::TSymb(char c)
{ ch=c;}
void TSymb::printCH()
{cout<<ch;}
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
   char *Ref;
  TSymb *smb[3]; 
  public:
     TString(char *ref);
     ~TString(void) {  delete Ref;}
      void prn();
};
 
TString::TString(char *ref)
{  char c;
    for (int i=0;i<3;i++){
     c=ref[i];
     smb[i]=new TSymb(c);
    }
}
void TString::prn()
{ 
    for(int i=0;i<3;i++)
        smb[i]->printCH();
}
и тест-функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{ 
  char c; char s[15];
  while(1==1) {
  cout <<"\n0-Vixod\n"; cin>>c;
  if (c=='0') break;
  cout<<"vvesti text <=50\n";
  cin>>s; //cin.getline(s, 50);
  TString str(s);
  str.prn();
             }
}
Проблема в том что выдает видимо после печати исключение
Нарушение прав доступа при чтении "0xccccccc0"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Worf
42 / 42 / 6
Регистрация: 06.02.2014
Сообщений: 227
23.04.2014, 11:56     Исключение Нарушение прав доступа при чтении #2
Прогони выполнение проги в отладочном режиме и посмотри, когда у тебя вылетает и поймёшь, от чего
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
23.04.2014, 12:03     Исключение Нарушение прав доступа при чтении #3
Цитата Сообщение от eugrita Посмотреть сообщение
TSymb *smb[3];
Ну и какую роль здесь выполняют указатели? Я скажу какую: портят память и больше ничего полезного! Потому что массив сам по себе статический!
А память портится из-за отсутствия конструктора копирования,
отсутствия оператора "="
отсутствия деструктора.

Поэтому, либо добаваляй всё перечисленное, либо используй TSymb smb[3];
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 405
23.04.2014, 13:06  [ТС]     Исключение Нарушение прав доступа при чтении #4
Не понял про отсутствие оператора "="
TSymb *smb[3] означала у меня агрегацию по ссылке (символы могут существовать и при уничтожении слова)
вариант TSymb smb[3]; означает агрегацию по значению - композицию. Не важно как это обзывать- лишь для понимания. Если прямо так TSymb smb[3]; то говорит -нет подходящего конструктора
вот сделал такой вариант с вектором (композиция)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
   char *Ref;
  vector <TSymb> smb; 
  public:
     TString(char *ref);
     ~TString(void) {  delete Ref;}
      void prn();
};
 
TString::TString(char *ref)
{  char c;
    for (int i=0;i<3;i++){
     c=ref[i];
     smb.push_back(TSymb(c));
    }
}
void TString::prn()
{ 
    for(int i=0;i<3;i++)
        smb[i].printCH();
}
теперь хоть печатает, но в конце опять то же исключение по доступу.
Надо видно еще деструкторы делать.

Добавлено через 54 секунды
Не понял про отсутствие оператора "="
TSymb *smb[3] означала у меня агрегацию по ссылке (символы могут существовать и при уничтожении слова)
вариант TSymb smb[3]; означает агрегацию по значению - композицию. Не важно как это обзывать- лишь для понимания. Если прямо так TSymb smb[3]; то говорит -нет подходящего конструктора
вот сделал такой вариант с вектором (композиция)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
   char *Ref;
  vector <TSymb> smb; 
  public:
     TString(char *ref);
     ~TString(void) {  delete Ref;}
      void prn();
};
 
TString::TString(char *ref)
{  char c;
    for (int i=0;i<3;i++){
     c=ref[i];
     smb.push_back(TSymb(c));
    }
}
void TString::prn()
{ 
    for(int i=0;i<3;i++)
        smb[i].printCH();
}
теперь хоть печатает, но в конце опять то же исключение по доступу.
Надо видно еще деструкторы делать.

Добавлено через 27 минут
Ну все добавил деструктор
C++
1
2
TString::~TString() 
{  smb.clear();}
и перестало валиться
Yandex
Объявления
23.04.2014, 13:06     Исключение Нарушение прав доступа при чтении
Ответ Создать тему
Опции темы

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