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

Удаление указателя на объект класса - C++

Восстановить пароль Регистрация
 
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 00:47     Удаление указателя на объект класса #1
Что-то ни как не могу разобраться, где у меня ошибка?!
Ниже приведен фрагмент кода:
C++
1
2
3
4
5
6
7
//...
shapes *ptr=0; //ptr - указатель базового типа, на объект производного класса (к примеру, ромба)
//...
ptr=new rhomb; //ромб - объект производного класса rhomb от базового класса shapes
//...
delete ptr; //удаление объекта (ромба)
//...
Вывод компилятора:
Кликните здесь для просмотра всего текста
HEAP[shapes.exe]: Heap block at 010E7748 modified at 010E77A0 past requested size of 50
ОС Windows инициировала точку останова в shapes.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в shapes.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит shapes.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
21.03.2013, 00:52     Удаление указателя на объект класса #2
Причем тут компилятор? Экстрасенсов нет, выкладывай весь код.
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 00:55  [ТС]     Удаление указателя на объект класса #3
Ok.
shapes.h

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
62
63
64
65
66
#include <iostream>
#include <locale>
#include <conio.h>
 
using namespace std;
 
struct point    //точка
{
    float x;
    float y;
};
 
class shapes    //базовый класс (фигуры)
{
protected:
    point center;   //центральная точка фигур
    float diag;     //диагональ (1-я для ромба)
 
public:
    shapes();
    ~shapes();
};
 
class square: public shapes //квадрат - производный от shapes
{
protected:
    point points[4];    //точки
 
public:
    square();
    square(point p, float d=5);
    ~square();
 
};
 
class rhomb: public square  //ромб - производный от square
{
private:
    float diag2;    //вторая диагональ робма
 
public:
    rhomb();
    ~rhomb();
};
 
class triangle: public shapes   //треугольник - производный от shapes
{
private:
    point points[3];    //точки
 
public:
    triangle();
    ~triangle();
 
};
 
class sector: public shapes //сектор - производный от shapes
{
private:
    point points[3];    //точки
    float angle;    //угол поворота
 
public:
    sector();
    ~sector();
};


impl.cpp

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "shapes.h"
//_______________SHAPES_______________
 
shapes::shapes()
{
    cout<<"\nВызов \"shapes()\";"<<endl;
};
 
shapes::~shapes()
{
    cout<<"\nВызов \"~shapes()\";"<<endl;
};
 
 
//_______________SQUARE_______________
 
square::square()
{
    cout<<"\nВызов \"square()\";"<<endl;
    point p;
    p.x=10;
    p.y=10;
    float d=10;
 
    points[1].x=p.x-d;
    points[1].y=p.y-d;
 
    points[2].x=p.x-d;
    points[2].y=p.y+d;
 
    points[3].x=p.x+d;
    points[3].y=p.y+d;
 
    points[4].x=p.x+d;
    points[4].y=p.y-d;
};
 
square::square(point p, float d)
{
    cout<<"\nВызов \"square(point, float)\";"<<endl;
    points[1].x=p.x-d;
    points[1].y=p.y-d;
 
    points[2].x=p.x-d;
    points[2].y=p.y+d;
 
    points[3].x=p.x+d;
    points[3].y=p.y+d;
 
    points[4].x=p.x+d;
    points[4].y=p.y-d;
};
 
square::~square()
{
    cout<<"\nВызов \"~square(point, float)\";"<<endl;
};
 
 
//_______________RHOMB_______________
 
rhomb::rhomb()
{
    cout<<"\nВызов \"rhomb()\";"<<endl;
};
 
rhomb::~rhomb()
{
    cout<<"\Вызов \"~rhomb()\";"<<endl;
};
 
 
//_______________TRIANGLE_______________
 
triangle::triangle()
{
    cout<<"\nВызов \"triangle()\";"<<endl;
};
 
triangle::~triangle()
{
    cout<<"\Вызов \"~triangle()\";"<<endl;
};
 
 
//_______________SECTOR_______________
 
sector::sector()
{
    cout<<"\nВызов \"sector()\";"<<endl;
};
 
sector::~sector()
{
    cout<<"\Вызов \"~sector()\";"<<endl;
};


main.cpp

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
62
63
64
65
66
67
68
69
70
71
72
#include "shapes.h"
 
void printMenu();   //вывести меню выбора фигуры
int main()
{
    int check, shapeNum;
    shapes *ptr=0;  //указатель базового типа shapes, на объект производного класса
    point p;    //центр фигуры
    float d;    //диагональ (радиус) фигуры
    
    //инициализация первоначальных данных фигуры
    p.x=3;  //центральная точка x
    p.y=2;  //центральная точка y
    d=4;    //диагональ
    
    setlocale (LC_ALL, "rus");
    while (1)
    {
        printMenu();    //меню выбора фигуры
        cin>>check;
    
        switch(check)   //создание фигуры
        {
        case 1:
            //ptr=new square();     //p=[10, 10]; d=10
            //ptr=new square(p);    //d=5
            ptr=new square(p, d);   //p=[3, 2]; d=4
            break;
        case 2:
            ptr=new rhomb;
            break;
        case 3:
            ptr=new triangle;
            break;
        case 4:
            ptr=new sector;
            break;
        case 0:
            check=0;
            break;
        default:
            ptr=new square;
            check=1;
            break;
        };
 
        if (check==0)   //выбран выход
            break;
 
        //switch(check) //выбор операции
        //{
        //case 1:
 
 
 
        delete ptr;
    };
    cout<<"\nВыход из программы!"<<endl;
    getch();
    return 0;
};
 
void printMenu()    //вывод меню выбора фигуры
{
    cout<<"\nВыберите фигуру:";
    cout<<"\n1. Квадрат;";
    cout<<"\n2. Ромб;";
    cout<<"\n3. Треугольник;";
    cout<<"\n4. Сектор;";
    cout<<"\n\n0. Выход.";
    cout<<"\n\n>: ";
};
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.03.2013, 00:58     Удаление указателя на объект класса #4
массивы point points[4];
должны индексироваться от 0 до 3, а не от 1 до 4.
Бросай классы - повторяй массивы.
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 01:03  [ТС]     Удаление указателя на объект класса #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
массивы point points[4];
должны индексироваться от 0 до 3, а не от 1 до 4.
Бросай классы - повторяй массивы.
Я знаю, что индексирование в массивах начинается с нуля, в данной задаче мне удобно с 1 начинать, и я не думаю, что это повлияло как-то на ошибки.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.03.2013, 01:07     Удаление указателя на объект класса #6
Цитата Сообщение от yol Посмотреть сообщение
мне удобно с 1 начинать, и я не думаю, что это повлияло как-то на ошибки.
вот именно. не думаешь.
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
21.03.2013, 01:12     Удаление указателя на объект класса #7
Цитата Сообщение от yol Посмотреть сообщение
мне удобно с 1 начинать
А памяти - нет. Запомните, что первый элемент массива всегда имеет индекс 0. Не зависимо от того, удобно вам это или нет.
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 01:22  [ТС]     Удаление указателя на объект класса #8
Хорошо, я учту это.
Но данное замечание, мне ни как не помогло! Как выдавал компилятор сообщение, так и выдает...
Т.е. программа запускается, но при выборе 1-го пункта - создать "квадрат", вылезает ошибка, после вызова деструктора базового класса "shapes". (Странно, почему деструктор квадрата не вызывается?!! :/ )
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 01:28     Удаление указателя на объект класса #9
Цитата Сообщение от yol Посмотреть сообщение
Странно, почему деструктор квадрата не вызывается?!!
Потому что деструктор в базовом классе не виртуальный.
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 01:30  [ТС]     Удаление указателя на объект класса #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что деструктор в базовом классе не виртуальный.
блин, точно))
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 01:31     Удаление указателя на объект класса #11
Цитата Сообщение от yol Посмотреть сообщение
Но данное замечание, мне ни как не помогло!
А мне помогло...
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 01:46  [ТС]     Удаление указателя на объект класса #12
Цитата Сообщение от alsav22 Посмотреть сообщение
А мне помогло...
а что за среда разработки у тебя? ну я вообще хз в чем же дело?! :/
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 01:49     Удаление указателя на объект класса #13
Индексы заменил?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
square::square(point p, float d)
{
    cout<<"\nВызов \"square(point, float)\";"<<endl;
    points[0].x=p.x-d;
    points[0].y=p.y-d;
 
    points[1].x=p.x-d;
    points[1].y=p.y+d;
 
    points[2].x=p.x+d;
    points[2].y=p.y+d;
 
    points[3].x=p.x+d;
    points[3].y=p.y-d;
};
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 01:53  [ТС]     Удаление указателя на объект класса #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Индексы заменил?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
square::square(point p, float d)
{
    cout<<"\nВызов \"square(point, float)\";"<<endl;
    points[0].x=p.x-d;
    points[0].y=p.y-d;
 
    points[1].x=p.x-d;
    points[1].y=p.y+d;
 
    points[2].x=p.x+d;
    points[2].y=p.y+d;
 
    points[3].x=p.x+d;
    points[3].y=p.y-d;
};
Ну да, я ведь писал.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 01:55     Удаление указателя на объект класса #15
Цитата Сообщение от yol Посмотреть сообщение
а что за среда разработки у тебя?
Студия 10. А у тебя?
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 02:01  [ТС]     Удаление указателя на объект класса #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Студия 10. А у тебя?
Тоже.
Если не сложно, мог бы еще раз проверить? Может быть я недоглядел

shapes.h
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
62
63
64
65
66
67
#include <iostream>
#include <locale>
#include <conio.h>
 
using namespace std;
 
struct point    //точка
{
    float x;
    float y;
};
 
class shapes    //базовый класс (фигуры)
{
protected:
    point center;   //центральная точка фигур
    float diag;     //диагональ (1-я для ромба)
 
public:
    shapes();
    virtual ~shapes();
};
 
class square: public shapes //квадрат - производный от shapes
{
protected:
    point points[3];    //точки
 
public:
    square();
    square(point p, float d=5);
    virtual ~square();
 
};
 
class rhomb: public square  //ромб - производный от square
{
private:
    float diag2;    //вторая диагональ робма
 
public:
    rhomb();
    rhomb(point p, float d=5, float d2=7);
    ~rhomb();
};
 
class triangle: public shapes   //треугольник - производный от shapes
{
private:
    point points[2];    //точки
 
public:
    triangle();
    ~triangle();
 
};
 
class sector: public shapes //сектор - производный от shapes
{
private:
    point points[2];    //точки
    float angle;    //угол поворота
 
public:
    sector();
    ~sector();
};


impl.cpp
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "shapes.h"
//_______________SHAPES_______________
 
shapes::shapes()
{
    cout<<"\nВызов \"shapes()\";"<<endl;
};
 
shapes::~shapes()
{
    cout<<"\nВызов \"~shapes()\";"<<endl;
};
 
 
//_______________SQUARE_______________
 
square::square()
{
    cout<<"\nВызов \"square()\";"<<endl;
    point p;
    p.x=10;
    p.y=10;
    float d=10;
 
    points[0].x=p.x-d;
    points[0].y=p.y-d;
 
    points[1].x=p.x-d;
    points[1].y=p.y+d;
 
    points[2].x=p.x+d;
    points[2].y=p.y+d;
 
    points[3].x=p.x+d;
    points[3].y=p.y-d;
};
 
square::square(point p, float d)
{
    cout<<"\nВызов \"square(point, float)\";"<<endl;
    points[0].x=p.x-d;
    points[0].y=p.y-d;
 
    points[1].x=p.x-d;
    points[1].y=p.y+d;
 
    points[2].x=p.x+d;
    points[2].y=p.y+d;
 
    points[3].x=p.x+d;
    points[3].y=p.y-d;
};
 
square::~square()
{
    cout<<"\nВызов \"~square()\";"<<endl;
};
 
 
//_______________RHOMB_______________
 
rhomb::rhomb()
{
    cout<<"\nВызов \"rhomb()\";"<<endl;
    point p;
    p.x=10;
    p.y=10;
    float d=10, d2=12;
 
    points[0].x=p.x-d;
    points[0].y=p.y;
 
    points[1].x=p.x;
    points[1].y=p.y+d2;
 
    points[2].x=p.x+d;
    points[2].y=p.y;
 
    points[3].x=p.x;
    points[3].y=p.y-d2;
};
 
rhomb::rhomb(point p, float d, float d2)
{
    cout<<"\nВызов \"rhomb(point, float, float)\";"<<endl;
    points[0].x=p.x-d;
    points[0].y=p.y;
 
    points[1].x=p.x;
    points[1].y=p.y+d2;
 
    points[2].x=p.x+d;
    points[2].y=p.y;
 
    points[3].x=p.x;
    points[3].y=p.y-d2;
};
 
rhomb::~rhomb()
{
    cout<<"\Вызов \"~rhomb()\";"<<endl;
};
 
 
//_______________TRIANGLE_______________
 
triangle::triangle()
{
    cout<<"\nВызов \"triangle()\";"<<endl;
};
 
triangle::~triangle()
{
    cout<<"\Вызов \"~triangle()\";"<<endl;
};
 
 
//_______________SECTOR_______________
 
sector::sector()
{
    cout<<"\nВызов \"sector()\";"<<endl;
};
 
sector::~sector()
{
    cout<<"\Вызов \"~sector()\";"<<endl;
};


main.cpp
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "shapes.h"
 
void printMenu();   //вывести меню выбора фигуры
int main()
{
    int check, shapeNum;
    shapes *ptr=0;  //указатель базового типа shapes, на объект производного класса
    point p;    //центр фигуры
    float d, d2;    //диагонали (радиус) фигуры
    
    //инициализация первоначальных данных фигуры
    p.x=3;  //центральная точка x
    p.y=2;  //центральная точка y
    d=4;    //диагональ
    d2=6;   //вторая диагональ (для ромба)
    
    setlocale (LC_ALL, "rus");
    while (1)
    {
        printMenu();    //меню выбора фигуры
        cin>>check;
    
        switch(check)   //создание фигуры
        {
        case 1:
            ptr=new square;         //p=[10, 10]; d=10
            //ptr=new square(p);    //p=[3, 2]; d=5
            //ptr=new square(p, d); //p=[3, 2]; d=4
            break;
        case 2:
            //ptr=new rhomb;            //p=[10, 10]; d=10; d2=12;
            ptr=new rhomb(p);           //p=[3, 2]; d=5; d2=7;
            //ptr=new rhomb(p, d);      //p=[3, 2]; d=4; d2=7;
            //ptr=new rhomb(p, d, d2);  //p=[3, 2]; d=4; d2=6;
            break;
        case 3:
            ptr=new triangle;
            break;
        case 4:
            ptr=new sector;
            break;
        case 0:
            check=0;
            break;
        default:
            ptr=new square;
            check=1;
            break;
        };
 
        if (check==0)   //выбран выход
            break;
 
        //switch(check) //выбор операции
        //{
        //case 1:
 
 
 
        delete ptr;
    };
    cout<<"\nВыход из программы!"<<endl;
    getch();
    return 0;
};
 
void printMenu()    //вывод меню выбора фигуры
{
    cout<<"\nВыберите фигуру:";
    cout<<"\n1. Квадрат;";
    cout<<"\n2. Ромб;";
    cout<<"\n3. Треугольник;";
    cout<<"\n4. Сектор;";
    cout<<"\n\n0. Выход.";
    cout<<"\n\n>: ";
};
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:03     Удаление указателя на объект класса #17
Размер массива зачем изменил?
C++
1
point points[3];
Это массив на три точки. Размер массива с максимальным индексом не путай. Массив нужен такой:
C++
1
point points[4];
Индексы:
C++
1
2
3
4
points[0];
points[1];
points[2];
points[3] ;
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
21.03.2013, 02:16  [ТС]     Удаление указателя на объект класса #18
Спасибо большое!)
На самом деле, пробел в знаниях)) Я немного по другому представлял)) А оказывается, я записывал уже не в ту область памяти, которая мне отводилась, поэтому такой косяк выходил
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 02:19     Удаление указателя на объект класса
Еще ссылки по теме:

C++ Статические функции: добавления указателя (типа AbstractClass) на объект данного класса
C++ Перегрузка оператора сравнения для указателя на объект
C++ Создание указателя типа базового класса на экземпляр производного класса

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:19     Удаление указателя на объект класса #19
Цитата Сообщение от yol Посмотреть сообщение
Я что-то не понял вашей мысли :/
Это не моя мысль, а правило объявления массивов в С++. Азы объяснять?
Yandex
Объявления
21.03.2013, 02:19     Удаление указателя на объект класса
Ответ Создать тему
Опции темы

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