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

Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error" - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Параллельный set_difference http://www.cyberforum.ru/cpp-beginners/thread1232255.html
Как лучше оформить на C++ такую задачу?
C++ Как сделать ровный вывод состояния регистров Всем исключительно доброго времени дня или ночи. Я начинающий, так что прошу сильно меня не пинать. В общем, вот в чём дело: По заданию в книге Дейтел Х. Дейтел П - Как программировать на С++,... http://www.cyberforum.ru/cpp-beginners/thread1232247.html
C++ Удалить (сделать прозрачными) все непрозрачные кубики, видимые хотя бы с одной из четырех сторон
Помогите, пожалуйста, отредактировать эту программу. Нужно переписать код, чтобы использовались функции. Текст задания: Поле размером mxn заполнено прозрачными и непрозрачными кубиками. ...
C++ Формула, по которой можно вычислить время наступления Рагнарека
Рагнарек должен наступить с минуты на минуту. Но Один не знает, когда именно он наступит. Локи, как самый умный, сказал Одину формулу, по которой можно вычислить время наступления Рагнарека. К...
C++ При выводе минимального элемента последовательности программа выводит слишком большое число http://www.cyberforum.ru/cpp-beginners/thread1232190.html
При выводе минимального элемента программа выводит слишком большое число. #include <iostream> using namespace std; int main() { setlocale(0,""); int maximum; float numbers, ...
C++ Sentence. Записать число прописью Once upon a time in a land far far away, inhabited only by math students, Iva and Vedran were discussing self-explanatory sentences. A part of these sentences is exactly one number and it is equal to... подробнее

Показать сообщение отдельно
zahvad
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 8

Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error" - C++

22.07.2014, 22:14. Просмотров 1902. Ответов 9
Метки (Все метки)

Здравствуйте. Возникла проблема с оператором "delete". Пользуюсь VisualStudio 2010. Программа компилируется нормально. Все отрабатывает. Когда дело доходит до освобождения памяти, выделенной операцией "new", вылетает ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)". Если закомментировать вызов "delete" - программа доходит до логического завершения. Очевидно, какая-то проблема с освобождением памяти. Если я выделяю память только на базовые объекты, "delete" нормально отрабатывает. Но при выделении памяти на любой унаследованный объект - вылетает вышеупомянутая ошибка. Похожая программа из книги по "С++", судя по словам автора книги, работает исправно. Вот код моей программы:
1) Заголовочный файл:
C++ (Qt)
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
class Person {
private:
    string name;
    string sname;
public:
    Person(char * n="Name",char * s="Surname") : name(n), sname(s) {}
    ~Person() {}
    virtual void Set();
    virtual void Show() const {
        cout << name << " " << sname << endl;
    }
};
 
class Gunslinger: virtual public Person {
private:
    int count;
protected:
    double Draw() const { return 3.14; }
public:
    Gunslinger(const int & a=0,char * n="Name",char * s="Surname") : Person(n,s), count(a) {}
    void Set();
    int GetCount() const {
        return count;
    }
    void Show() const {
        Person::Show();
        cout << "Количество насечек: " << count << endl;
        cout << "Время приведения в боеготовность: " << Draw() << " секунды." << endl;
    }
};
 
struct Card {
    short name;
    char * suit;
};
class Deck {
private:
    Card Cards[52];
    static char * suits[4];
public:
    Deck();
    Card randomcard() const { return Cards[rand()%51]; }
    friend ostream & operator<<(ostream & os, const Card & C);
};
 
class PokerPlayer : virtual public Person {
private:
    Deck D;
protected:
    Card Draw() const { return D.randomcard(); }
public:
    PokerPlayer(char * n="Name",char * s="Surname") : D(), Person(n,s) {}
    void Set();
    void Show() const { 
        Person::Show();
        cout << Draw();
    }
};
class BadDude: public Gunslinger, public PokerPlayer {
private:
    double Gdraw() const { return Gunslinger::Draw(); }
    Card Cdraw() const { return PokerPlayer::Draw(); }
public:
    BadDude(const int & a=0,char * n="Name",char * s="Surname") : Person(n,s), Gunslinger(a,n,s), PokerPlayer(n,s) {}
    void Set();
    void Show() const {
        Person::Show();
        cout << "Количество насечек: " << Gunslinger::GetCount() << endl;
        cout << "Время приведения в боеготовность: " << Gdraw() << " секунды." << endl;
        cout << "Карта: " << Cdraw() << endl;
    }
};
2) Файл реализации:
C++ (Qt)
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
char * Deck::suits[4]={"spades","clubs","diamonds","hearts"};
 
Deck::Deck() {
    srand(time(NULL));
    int t=2, s=0;
    for(int i=0;i<52;i++,t++) {
        if(t==15) {
            t=2;
            s++;
        }
        Cards[i].name=t;
        Cards[i].suit=suits[s];
        }
};
 
ostream & operator<<(ostream & os, const Card & C) {
    cout << C.name << " of " << C.suit << endl;
    return os;
}
void Person::Set() {
    cout << "Введите имя: ";
    getline(cin,name);
    cout << "Введите фамилию: ";
    getline(cin,sname);
}
void Gunslinger::Set() {
    Person::Set();
    cout << "Введите количество насечек: ";
    cin >> count;
}
void PokerPlayer::Set() {
    Person::Set();
}
void BadDude::Set() {
    Gunslinger::Set();
}
3) Файл исходного кода:
C++ (Qt)
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
void main() {
setlocale(LC_ALL,"Russian");
 
Person * Guys[5]; 
int ct; 
for (ct=0;ct<5;ct++) 
{ 
char choice; 
cout << "Enter the guy category:\n"
<< "p: person g: gunslinger " 
<< "o: pokerplayer b:baddude q: quit\n";
cin >> choice; 
while (strchr("pgobq", choice) == NULL) 
{ 
cout << "Please enter a p, g, o, b or q: "; 
cin >> choice; 
} 
if (choice == 'q') 
break; 
switch(choice) 
{ 
case 'p': Guys[ct] = new Person; 
break; 
case 'g': Guys[ct] = new Gunslinger; 
break; 
case 'o': Guys[ct] = new PokerPlayer;
break;
case 'b': Guys[ct] = new BadDude;
break;
} 
cin.get(); 
Guys[ct]->Set(); 
} 
cout << "\nHere is your staff:\n"; // вывод списка работников 
int i; 
for(i=0;i<ct;i++) 
{ 
cout << endl;
cout << "Объект № " << i+1 << ":\n\n";
Guys[i]->Show(); 
}
for(i=0;i<ct;i++)
delete Guys[i];
cout << "\nDone!\n\n";
}
Все необходимые заголовочные файлы подключены. Помогите пожалуйста решить проблему. Конечно, можно было бы пропустить эту ошибку и изучать язык дальше. Но так не интересно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru