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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
#1

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

06.06.2013, 08:50. Просмотров 385. Ответов 5
Метки нет (Все метки)

Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет ). Для начала приведу часть кода, в котором, как мне кажется, заключена ошибка:

Есть три класса: 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. Попробовал по совету указателям присваивать нулевые значения, попробовал написать деструкторы классов - ничего не меняется.

Очень надеюсь на помощь! Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 08:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при использовании new[] / delete[] (C++):

Ошибка при использовании delete - C++
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю что не так делаю: class CMenu { ...

Ошибка при использовании оператора delete в Visual Studio 2010 - C++
Изучаю указатели в C++. Есть следующий код: #include &lt;iostream&gt; #include &lt;locale&gt; using namespace std; int main() { ...

Утечки памяти при использовании new/delete для двумерных массивов - C++
Добрый день. Суть в том, что есть несколько функций, получающих на вход и возвращающих двумерные массивы. Реализация передачи массивов...

Ошибка при работе delete в деструкторе - C++
enum place { first = 1, second }; class Passanger { public: Passanger(); void Call(); void PushButton(); int...

Ошибка при освобождении памяти (delete) - C++
Здравствуйте! Есть массив lines, созданный вот так : int *line = new int ; Потом, пытаюсь его удалить и пересоздать : delete...

Ошибка при удалении массива с помощью delete - C++
Изучаю C++ и у меня задание разбить текст неопределенной длинны на массив строк. Нацарапал класс типа string ниже выложу. В него задача...

5
Croessmah
Эксперт CЭксперт С++
13408 / 7558 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
06.06.2013, 09:07 #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];
0
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
06.06.2013, 11:23  [ТС] #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), чтобы нумерация их велась с первого, а не нулевого. Чтоб сам не запутался.

Про инициализацию пошел читать.
0
Croessmah
Эксперт CЭксперт С++
13408 / 7558 / 853
Регистрация: 27.09.2012
Сообщений: 18,590
Записей в блоге: 3
Завершенные тесты: 1
06.06.2013, 11:40 #4
Цитата Сообщение от Mihail Samohval Посмотреть сообщение
Про кусочек кода, что вы посоветовали посмотреть - не могу понять, что не так
У Вас выход за пределы массива!
1
Mihail Samohval
5 / 5 / 1
Регистрация: 06.06.2013
Сообщений: 23
06.06.2013, 11:50  [ТС] #5

Не по теме:

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



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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 11:53
Привет! Вот еще темы с ответами:

Ошибка с delete при удалении памяти из-под строки - C++
strngbad.h // strngbad.h -- flawed string class definition #include &lt;iostream&gt; #ifndef STRNGBAD_H_ #define STRNGBAD_H_ class...

Ошибка при использовании % - C++
(условие задачи, код и ошибки при коомпиляции на скрине) Здравствуйте, задача простая, как и ее решение, на фортране бы уже пять раз...

Ошибка при использовании gets() - C++
Не могу понять, почему при второй итерации цикла программа выдает ошибку и закрывается при запросе фамилии. #include &quot;stdafx.h&quot; ...

Ошибка при использовании size_t - C++
Выдает много ошибок связанные с использованием typedef std::size_t size_type; #include &lt;iostream&gt; #include &lt;cstring&gt; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2013, 11:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru