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

системная ошибка BLOCK_TYPE_VALID - C++

Восстановить пароль Регистрация
 
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
11.03.2013, 17:33     системная ошибка BLOCK_TYPE_VALID #1
программа создает базовый класс "Дерево" + 2 производных класса - лесное дерево и плодовое дерево. Вне зависимости от мейна выскакивает системная ошибка
head.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
68
69
70
71
72
73
74
75
76
77
#ifndef _TREEE_
#define _TREEE_
#include <iostream>
#include <cmath>
using namespace std;
enum Type {list, hvoy};
class Tree{
protected:
    const int ID;
    char * Name;
    unsigned Age;
    const Type Tip;
    static int ID_Repository;
    static public void SetID_Repository (int a) {ID_Repository=a;}
public:
    Tree();
    Tree(char * aName, unsigned aAge, Type aTip);
    Tree (const Tree& Ob);
    virtual ~Tree();
    int GetID() const ;
    char * GetName () const;
    unsigned GetAge () const;
    Type GetTip ()const;
    bool operator < (const Tree & e) const;
    bool operator == (const Tree & e) const;
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void Print ();
    Tree& operator = (const Tree & e);
};
class LesTree: public Tree {
protected:
    double Drev;
public:
    LesTree();
    LesTree(char * aName, unsigned aAge, Type aTip, double aDrev);
    LesTree (const LesTree& Ob);
    ~LesTree();
    int GetID() const;
    char * GetName () const;
    unsigned GetAge () const;
    double GetDrev () const;
    Type GetTip ()const;
    bool operator < (const LesTree & e) const;
    bool operator == (const LesTree & e) const;
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void SetDrev (double aDrev);
    void InStream (ostream& out);
    LesTree& operator = (const LesTree & e);
};
class PlodTree : public Tree{
    protected:
    double Mas;
    double Hran;
public:
    PlodTree();
    PlodTree(char * aName, unsigned aAge, Type aTip, double Mas, double Hran);
    PlodTree (const PlodTree& Ob);
    ~PlodTree();
    int GetID() const;
    char * GetName () const;
    unsigned GetAge () const;
    double GetMas () const;
    double GetHran () const;
    Type GetTip ()const;
    bool operator < (const PlodTree & e) const;
    bool operator == (const PlodTree & e) const;
    void SetAge (unsigned aAge);
    void SetName (const char * aName);
    void SetMas (double aMas);
    void SetHran (double aHran);
    void InStream (ostream& out);
    PlodTree& operator = (const PlodTree & e);
};
 
#endif
real.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
#include "head.h"
char *tip[2]={"Лиственное","Хвойное"};
int Tree::ID_Repository = 0;
Tree::Tree():ID(ID_Repository++),Age(100),Tip(list){
    char * s = "Дуб";
    Name=new char[strlen(s)+1];
    strcpy(Name,s);
    delete s;
}
Tree::Tree(char * aName, unsigned aAge, Type aTip):ID(ID_Repository++),Age(aAge),Tip(aTip){
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
Tree::Tree (const Tree& Ob):Age(Ob.Age),Tip(Ob.Tip),ID(ID_Repository++){
    Name=new char [strlen(Ob.Name)+1];
    strcpy(Name,Ob.Name);
}
Tree::~Tree(){
    delete []Name;
}
int Tree::GetID() const {
    return ID;
}
char * Tree::GetName () const{
    char * s=new char[strlen(Name)+1];
    strcpy (s,Name);
    return s;
}
unsigned Tree::GetAge () const{
    return Age;
}
Type Tree::GetTip ()const{
    return Tip;
}
bool Tree::operator < (const Tree & e) const{
    if (strcmp(Name,e.Name)<0)
        return true;
    return false;
}
bool Tree::operator == (const Tree & e) const{
    if (strcmp(Name,e.Name)==0)
        return true;
    return false;
}
void Tree::SetAge (unsigned aAge){
    Age=aAge;
}
void Tree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
Tree& Tree::operator = (const Tree & e){
    Age=e.Age;
    delete []Name;
    Name=new char [strlen(e.Name)+1];
    strcpy(Name,e.Name);
    return *this;
}
void Tree::Print (){
    cout<<"Возраст: "<<Age<<" Тип: "<<tip[Tip]<<" Имя: ";
    puts(Name);
}
LesTree::LesTree():Tree("Дуб",100,list),Drev(23){}
LesTree::LesTree(char * aName, unsigned aAge, Type aTip, double aDrev):Tree(aName, aAge, aTip),Drev(aDrev){}
LesTree::LesTree (const LesTree& Ob):Tree(Ob.Name,Ob.Age,Ob.Tip),Drev(Ob.Drev){}
LesTree::~LesTree(){delete []Name;}
int LesTree::GetID() const {return ID;}
char * LesTree::GetName () const{
    char * s=new char[strlen(Name)+1];
    strcpy(s,Name);
    return s;}
unsigned LesTree::GetAge () const {return Age;}
double LesTree::GetDrev () const {return Drev;}
Type LesTree::GetTip ()const {return Tip;}
void LesTree::SetAge (unsigned aAge){Age=aAge;}
void LesTree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);
}
void LesTree::SetDrev (double aDrev){Drev=aDrev;}
LesTree& LesTree::operator = (const LesTree & e){
    if (&e!=this)
    {
        Age=e.Age;
        delete []Name;
        Name=new char [strlen(e.Name)+1];
        strcpy(Name,e.Name);
        Drev=e.Drev;}
    return *this;
}
PlodTree::PlodTree():Tree("Яблоня",10,list),Mas(10.5),Hran(3){}
PlodTree::PlodTree(char * aName, unsigned aAge, Type aTip, double aMas, double aHran):Tree(aName,aAge,aTip),Mas(aMas),Hran(aHran){}
PlodTree::PlodTree (const PlodTree& Ob):Tree(Ob.Name,Ob.Age,Ob.Tip),Mas(Ob.Mas),Hran(Ob.Hran){}
PlodTree::~PlodTree(){delete []Name;}
int PlodTree::GetID() const {return ID;}
char * PlodTree::GetName () const {
    char *s=new char[strlen(Name)+1];
    strcpy(s,Name);
    return s;}
unsigned PlodTree::GetAge () const {return Age;}
double PlodTree::GetMas () const {return Mas;}
double PlodTree::GetHran () const {return Hran;}
Type PlodTree::GetTip ()const {return Tip;}
void PlodTree::SetAge (unsigned aAge){Age=aAge;}
void PlodTree::SetName (const char * aName){
    delete []Name;
    Name=new char[strlen(aName)+1];
    strcpy(Name,aName);}
void PlodTree::SetMas (double aMas) {Mas=aMas;}
void PlodTree::SetHran (double aHran){Hran=aHran;}
PlodTree& PlodTree::operator = (const PlodTree & e){
    if (this!=&e)
    {
        Age=e.Age;
        Mas=e.Mas;
        Hran=e.Hran;
        delete []Name;
        Name=new char [strlen(e.Name)+1];
        strcpy(Name,e.Name);
    }
    return *this;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "head.h"
int main ()
{
    setlocale (LC_ALL,".1251");
    Tree a("Ясень", 20,list);
    a.Print();
    Tree b("Ель",13,hvoy);
    cout<<endl;
    b.Print();
    PlodTree pa("Груша",1,list,0,0);
    PlodTree pb("Яблоня",13,list,12,6);
    if ((Tree)pa<(Tree)pb)
        cout<<"first is less then second"<<endl;
    else cout<<"second is less then first"<<endl;
    if((Tree)pa==(Tree)pb)
        cout<<"they are equal"<<endl;
    else cout<<"they are not equal"<<endl;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 17:33     системная ошибка BLOCK_TYPE_VALID
Посмотрите здесь:

системная информация C++
системная ошибка в ходе выполнения программы (наверно несоответствие типов) C++
Системная дата C++
C++ Системная ошибка
C++ Системная дата в С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 18:16     системная ошибка BLOCK_TYPE_VALID #2
C++
1
PlodTree::~PlodTree(){delete []Name;}
Здесь вы память какого объекта освобождаете? Родительского? А деструктор родительского класса не тоже самое делает?
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
11.03.2013, 18:20  [ТС]     системная ошибка BLOCK_TYPE_VALID #3
а у меня ведь деструктор родительский является виртуальным, разве он будет затрагиваться в данной ситуации? (извините, просто правда не знаю)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 18:23     системная ошибка BLOCK_TYPE_VALID #4
Цитата Сообщение от mazukta26 Посмотреть сообщение
а у меня ведь деструктор родительский является виртуальным, разве он будет затрагиваться в данной ситуации?
Виртуальность на другое влияет. В любом случае, сначала вызывается деструктор родительского класса. У вас повторное освобождение памяти. Сделайте пустым деструктор производного класса и ошибка исчезнет.
KostyaKulakov
Заблокирован
11.03.2013, 18:25     системная ошибка BLOCK_TYPE_VALID #5
была подобная проблема, решилась добавлением конструктора копирования.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 19:15     системная ошибка BLOCK_TYPE_VALID #6
Прошу прощения, не так написал. Всё наоборт: сначала деструктор производного класса работает, потом родителского, но двойное освобождение есть в коде.

Добавлено через 37 минут
Виртуальность вот на это влияет. Вот такой код:
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
#include <iostream>
using namespace std;
 
class A 
{
  public :
    /*virtual*/ ~A() { cout << "dA" << endl; }
 
};
 
class B : public A
{
  public :
        ~B() { cout << "dB" << endl;}
};
 
int main()
{
    A *pA = new B;
    delete pA;
    
    system("pause");
    return 0;
}
Если деструктор не виртуальный, то будет вызван деструктор для A (по типу указателя (или ссылки)), с которым связан объект. Если же деструктор сделать виртуальным, то всё будет правильно: сначала будет вызван деструктор для В, потом для А.
Yandex
Объявления
11.03.2013, 19:15     системная ошибка BLOCK_TYPE_VALID
Ответ Создать тему
Опции темы

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