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

Ошибка при использовании new[] / delete[] - C++

Восстановить пароль Регистрация
 
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
06.06.2013, 08:50     Ошибка при использовании new[] / delete[] #1
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет ). Для начала приведу часть кода, в котором, как мне кажется, заключена ошибка:

Есть три класса: Floor - этаж, Psng - пассажир. И главный класс Build - здание, в котором они все будут взаимодействовать.

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
class Build {
public:
        Build(int );
..............................
        Lift L;
        Psng *Pas;
        
private:
        Floor *F;
        int numFloors;
        int numPsngs;
 
 
};
///////////////////////////////////// 
#pragma package(smart_init)
Build::Build (int n)     // создает здание с опр кол-вом этажей
{
        numFloors = n; // инициализация всех переменных класса.
        numPsngs = 0;
        Pas = NULL; F = NULL;
        Pas = new Psng[2];
        F = new Floor[numFloors];
}
Build::~Build ()
{
        delete [] Pas;
        delete [] F;
}
 
void Build::createPsng()  // шанс создания пассажира. 
{
        int n = 20; // вероятность создания пассажира
        if (random(100)<n)
                {
                Psng Pswap;
                if(findFreeFloor(Pswap))
                {
                Psng *P1 = new Psng [numPsngs+2];
                for (int i = 1; i<=numPsngs;i++)  P1[i] = Pas[i];
                P1[numPsngs+1] = Pswap;
                delete [] Pas; Pas = NULL;
                numPsngs++;
                Pas = new Psng[numPsngs+1];
                for (int i = 1; i<=numPsngs;i++) Pas[i] = P1[i];
                delete [] P1; P1 = NULL;
                movingLift(Pswap.location , Pswap.destination );
                }
                }
 
}
 
void Build::deletePsng( int del)  // ВОТ ТУТ ВРОДЕ ОШИБКА
{
        Psng *P1 = new Psng [numPsngs];
        for (int i=1; i<=numPsngs;i++)
        if (i<del) P1[i] = Pas[i]; else
         P1[i] = Pas[i+1];
         delete [] Pas;
         Pas = NULL;
         numPsngs--;
         Pas = new Psng[numPsngs+1];
         for (int i = 1; i<=numPsngs;i++) Pas[i] = P1[i];
         delete [] P1;
         P1 = NULL;
}
вот. Проблема возникает при удалении какого-нибудь пассажира из массива - удаляет его корректно, сдвигает остальных, все здорово, но сбивается массив Floor *F: в классе Floor есть переменная типа bool и после вызова функции deletePsng(i); в цикле, у всего массива F значения этой переменной bool становятся странными: 47 92 136 и т.д.

Я подозреваю, что при удалении я как-то некорректно высвобождаю или выделяю память и из-за этого что-то влезает в мой массив *F. Попробовал по совету указателям присваивать нулевые значения, попробовал написать деструкторы классов - ничего не меняется.

Очень надеюсь на помощь! Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
06.06.2013, 09:07     Ошибка при использовании new[] / delete[] #2

Не по теме:

Цитата Сообщение от Mihail Samohval Посмотреть сообщение
// инициализация всех переменных класса.
И все-таки присвоение, а не инициализация. В книге об этом не пишут разве?



Цитата Сообщение от Mihail Samohval Посмотреть сообщение
но сбивается массив Floor *F: в классе Floor
И где этот класс? Хотя можно по звездам определить

Добавлено через 1 минуту
И как минимум тут посмотрите:
C++
1
2
3
4
        Psng *P1 = new Psng [numPsngs];
        for (int i=1; i<=numPsngs;i++)
        if (i<del) P1[i] = Pas[i]; else
         P1[i] = Pas[i+1];
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
06.06.2013, 11:23  [ТС]     Ошибка при использовании new[] / delete[] #3
Ну класс этот совсем простой:
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
#ifndef FloorH
#define FloorH
 
//---------------------------------------------------------------------------
#endif
class Floor {
public:
        Floor();
        void busyFloor();
        void freeFloor();
        bool getBusy();
private:
        bool busy;
};
 
 
 
#pragma hdrstop
#include <iostream.h>
#include "Floor.h"
 
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
Floor::Floor()
{
        busy = 0;
}
void Floor::busyFloor()
{
        busy = 1;
}
 
void Floor::freeFloor()
{
        busy = false;
}
 
bool Floor::getBusy()
{
        return busy;
}
Про кусочек кода, что вы посоветовали посмотреть - не могу понять, что не так: я просто переписываю все значения, кроме одного. Кстати в функции createPsng сделана такая странная нумерация (не просто количество пассажиров numPsngs, а numPsngs+1), чтобы нумерация их велась с первого, а не нулевого. Чтоб сам не запутался.

Про инициализацию пошел читать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
06.06.2013, 11:40     Ошибка при использовании new[] / delete[] #4
Цитата Сообщение от Mihail Samohval Посмотреть сообщение
Про кусочек кода, что вы посоветовали посмотреть - не могу понять, что не так
У Вас выход за пределы массива!
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
06.06.2013, 11:50  [ТС]     Ошибка при использовании new[] / delete[] #5

Не по теме:

насчет инициализации не понял. Написано: данные-элементы класса не могут получать начальные значения в определении класса. После создания объекта его элементы могут быть инициализированы с помощью функции конструктор.



Добавлено через 6 минут
О да! Как же я не заметил?! Спасибо большое!
Croessmah
06.06.2013, 11:53     Ошибка при использовании new[] / delete[]
  #6

Не по теме:

Цитата Сообщение от Mihail Samohval Посмотреть сообщение
Как же я не заметил?!
Это Вы меня спрашиваете?

Yandex
Объявления
06.06.2013, 11:53     Ошибка при использовании new[] / delete[]
Ответ Создать тему
Опции темы

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