Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2009, 19:44   #1
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию Стек на базе класса

При выполнении деструктора компилятор выдает ошибку access violation...
Вот код программы, буду благодарен, если будет указана в чем ошибка и путь её утранения
bullet.h
Код:
#ifndef bullet_h
#define bullet_h
class Bullet
{
private:
    Bullet * last;
    Bullet * top;
    double mass;
    int speed;
    int thick_arm;
public:
    Bullet ();
    ~Bullet ();
    void Push (double a, int b, int c);
    void Print ();
    bool IsEmpty ();
    void Pop ();
};
#endif
main.cpp
Код:
#include "bullet.h"
#include <iostream>
using namespace std;
int main ()
{
    int magazine;
    int code;
    int amount;
    Bullet AK74;
    cout << "Enter amount of cartridge in magazine, no more 35\n";
    cin >> magazine;
    if (magazine <= 35)
    {
    for( int i=0; i<magazine; i++)
    {
        cout << "tracer bullet(1),usual bullet(2),armour-piercing(3)\n";
        cin >> code;
        switch (code)
        {
        case 1: AK74.Push(10.3,883,6);break;
        case 2: AK74.Push(10.5,880,5);break;
        case 3: AK74.Push(10.7,880,16);break;
        }
    }
    }
    else
    {
        cout<<"Incorrect amount!\n";
    }
    cout << "Enter amount of cartridge for fire\n";
    cin >> amount;
    if (amount <= magazine )
    {
        AK74.Print();
    }
    else
    {
        "Incorrect amount!\n";
    }
    system ("PAUSE");
    return 0;
}
bullet.cpp

Код:
#include "bullet.h"
#include <iostream>
using namespace std;

Bullet ::Bullet()
{
    mass = 0;
    speed = 0;
    thick_arm = 0;
    top = NULL;
    last = NULL;
}
Bullet :: ~Bullet()
{
  while( !IsEmpty() )
    {
        Pop();
    }
  delete (this);
}
void Bullet :: Push(double a, int b, int c)
{
    Bullet * newit;
    newit = (Bullet *)malloc(sizeof(class Bullet));
    newit->last = top;
    newit->mass = a;
    newit->speed = b;
    newit->thick_arm = c;
    top = newit;
}
void Bullet :: Print ()
{
    Bullet * newit = this->top;
    while(newit != NULL)
    {
        cout << "Mass = " << newit->mass<<"\n";
        cout << "Speed = " << newit->thick_arm <<"\n";
        cout << "Thickness = " << newit->thick_arm <<"\n";
        cout<<endl;
        newit = newit->last;
    }
}
bool Bullet::IsEmpty()
{
    if(!(this))
        {
            return true;
        }
    if(!top)
        {
            return true;
        }
    return false;
}
void Bullet :: Pop()
{   
    Bullet * iter = this->top;

    this->top = iter->last;

    if ( iter != NULL )
    {
        delete iter;
    }
}
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 27.04.2009, 19:56   #2
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

В деструкторе ты удаляешь сам объект с помощью delete.
В функции main создается автоматический объект (в стэке)...
access violation появляется из-за попытки освободить память в стэке
убери
Код:
delete (this);
в деструкторе, и все будет работать ))
d9m0n вне форума Ответить с цитированием
Старый 27.04.2009, 20:02   #3
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

Вся проблема возникает в функции pop()... Удаление этой строки в коде не помогает.
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 27.04.2009, 20:24   #4
d9m0n
Пользователь
 
Регистрация: 03.03.2009
Сообщений: 29
По умолчанию

вместо malloc в функции Push нужно выделять память с помощью new...
или освобождать в с помощью free а не delete в Pop :-)
d9m0n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
стек в PM vladimir0108 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 08.01.2009 01:18
Стек Еленка Помощь студентам 2 06.06.2008 18:58
Создание нового класса на базе существующего SpiritSm Общие вопросы Delphi 1 19.07.2007 10:11
Создание нового класса на базе существующего SpiritSm Помощь студентам 1 19.07.2007 01:05
Стек Dr.zlo Работа с сетью в Delphi 6 09.07.2007 07:59