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

Выделение памяти под массив структур - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Quick sort c++ http://www.cyberforum.ru/cpp-beginners/thread540443.html
Добрый день. Есть вопрос, как можно реализовать Quick sort с подсчётом перестановок. По условию задания у нас есть 10000 элементов. В первый раз сортирует с центра и выводит сколько было перестановок. Во второй раз с конца и выводит сколько было перестановок. В третьи раз с начало и выводит сколько было перестановок.
C++ как отслеживать Http трафик? как отслеживать и парсить траф? Можете обьяснить на словах http://www.cyberforum.ru/cpp-beginners/thread540405.html
C++ Информация о вызванной перегрузке функции
нужно в соответствии с замечанием изменить прилагаемый код : Сделать так, чтоб было видно, какая из перегруженных функций вызывалась. Напрмер функция дополнительно выводмиь строку типа "Результат вызова функции с целыми параметрами". #include <stdio.h> int isNegative(int val); int isNegative(double val); int main() { int a = 0; double b = 0;
C++ В одномерном массиве удалить промежуток элементов от максимального до минимального
В одномерном массиве удалить промежуток элементов от максимального до минимального
C++ Динамический массив http://www.cyberforum.ru/cpp-beginners/thread540391.html
Сформировать динамический двумерный массив, заполнить его случайными числами и вывести на печать. Добавить строки после каждой четной строки матрицы. #include <conio.h> #include <iostream.h> #include <stdlib.h> int main()
C++ Нужно найти ОШИБКУ в программе УСЛОВИЕ: Дан текст, состоящий не менее чем из пяти слов. Вывести на экран слова, которые имеют одинаковые окончания "ИЯ","ИСТ","ИКА". #include <iostream> #include <string.h> #include <stdio.h> using namespace std; void main () { setlocale(LC_ALL,"rus"); подробнее

Показать сообщение отдельно
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
06.04.2012, 11:13     Выделение памяти под массив структур
Возникла проблема в том что не могу никак эфективно реализовать выделение памяти под массив структур, более того: единожды выделив память я её даже освободить не могу!

Условие задания: есть класс машин (у каждой свой номер) и класс водителей (у каждого имя и фамилия). В каждом из классов есть структура TLog* что имеет вид
C++
1
2
3
4
5
    struct TLog
     {
       string m_Date;
       CCar* m_Car;//либо CDriver* m_Driver
     };
Структура позволяет хранить в классе машин кто на них ездил, а в классе пользователей на каких машинах они ездили. Класс CDriver и CCar практически полностью идентичны и проблема с выделением памяти у меня возникла и там и там, но я остановлюсь только на CCar. Выделяю я память под структуру TLog в функции usingCar (описана внизу перед main):
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//почти полная копия CCar, можно просто пролистать его
class CDriver
{
public:
    CDriver(const string& name, const string& surname)
    {
        m_Name= name;
        m_Surname= surname;
        m_LogNr= 0;
        m_Log= new TLog[1];
    }
 
 
 
    ~CDriver()
    {
        delete [] m_Log;
    }
 
    void usingCar(CCar* what, const string& when)
     {
         if(m_LogNr==0)
         {
            m_Log[0].m_Car=what;
            m_Log[0].m_Date=when;
 
            m_LogNr++;
            return;
        }
 
        TLog* tempLog=new TLog[m_LogNr+1];
        memmove(tempLog,m_Log,sizeof(TLog)*m_LogNr);
        m_Log=tempLog;
 
        m_Log[m_LogNr].m_Date=when;
        m_Log[m_LogNr].m_Car=what;
        m_LogNr++;
 
 
 
        qsort(m_Log, m_LogNr, sizeof(TLog), CDriver::compareDriversInside);
     }
 
 
     string getName() const
     {
         return (m_Name+" "+m_Surname);
     }
 
    static int compareDriversInside(const void* _first, const void* _second)
    {
        const TLog* first= (TLog*) _first;
        const TLog* second= (TLog*) _second;
        return first->m_Date.compare(second->m_Date);
    }
 
    friend ostream& operator <<(ostream& os,const CDriver& base);
protected:
    struct TLog
     {
       string m_Date;
       CCar* m_Car;
     };
 
    string m_Name;
    string m_Surname;
    TLog* m_Log;
    int m_LogNr;
 };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class CCar
 {
public:
   CCar(const string& RZ)
   {
       m_RZ=RZ;
       m_LogNr=0;
       m_Log= new TLog[1];///выделяю память под один элемент
   }
 
   ~CCar()
   {
       delete []m_Log;
   }
 
   void usingCar(CDriver* who, const string& when);///здесь и возникает проблема, описана чуть ниже
 
    const string& getRZ() const
    {
        return m_RZ;
    }
 
    static int compareCarsInside(const void* _first, const void* _second)
    {
        const TLog* first= (TLog*) _first;
        const TLog* second= (TLog*) _second;
        return first->m_Date.compare(second->m_Date);
    }
 
    friend ostream& operator <<(ostream& os,const CCar& base);
protected:
    struct TLog
     {
       string m_Date;//когда
       CDriver* m_Driver;//кто
     };
    string m_RZ;//регистрационный номер авто
    TLog* m_Log;//структура с записями кто и когда водил авто
    int m_LogNr;//сколько записей о использовании авто у нас есть
 };
 
 ostream& operator <<(ostream& os,const CDriver& base)
{
    os<<base.m_Name<<" "<<base.m_Surname<<endl;
    for(int i=0;i<base.m_LogNr;i++)
     os<<base.m_Log[i].m_Date<<": "<<base.m_Log[i].m_Car->getRZ()<<endl;
    return os;
}
 
ostream& operator <<(ostream& os,const CCar& base)
{
    os<<base.m_RZ<<endl;
    for(int i=0;i<base.m_LogNr;i++)
     os<<base.m_Log[i].m_Date<<": "<<base.m_Log[i].m_Driver->getName()<<endl;
 
    return os;
}
 
 
 
 
//проблемы появляются здесь так как здесь происходит утечка памяти
void CCar::usingCar(CDriver* who, const string& when)
{
    if(m_LogNr==0) //память уже была выделена конструктором для первого элемента
    {
        m_Log[0].m_Driver=who;
        m_Log[0].m_Date=when;
 
        m_LogNr++;
        return;
    }
    //иначе нужно выделить память под массив на 1 больше чем был
    
    TLog* tempLog=new TLog[m_LogNr+1];
    memmove(tempLog,m_Log,sizeof(TLog)*m_LogNr);
    //m_Log не удаляется
    m_Log=tempLog;
 
    m_Log[m_LogNr].m_Date=when;
    m_Log[m_LogNr].m_Driver=who;
    
    m_LogNr++;
}
 
 
int main()
{
    CCar* car= new CCar("XYZ-123");
    CDriver* driver=new CDriver("Homer", "Simpson");
    CDriver* driver2= new CDriver("Magre", "Simpson");
    car->usingCar(driver,"3");
    car->usingCar(driver,"1");
    car->usingCar(driver2,"2");
    cout<<*car;
    delete car;
}
Сейчас как видно там происходит явная утечка памяти так как старая память не освобождается! Подскажите как же здесь поступить?

Мои попытки решений:
Пытаюсь удалять старую память - программа вываливается (но почему же?):
показать код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//проблемы появляются здесь так как здесь происходит утечка памяти
void CCar::usingCar(CDriver* who, const string& when)
{
    if(m_LogNr==0) //память уже была выделена конструктором для первого элемента
    {
        m_Log[0].m_Driver=who;
        m_Log[0].m_Date=when;
 
        m_LogNr++;
        return;
    }
    //иначе нужно выделить память под массив на 1 больше чем был
 
    TLog* tempLog=new TLog[m_LogNr+1];
    memmove(tempLog,m_Log,sizeof(TLog)*m_LogNr);
    delete [] m_Log; //ОСВОБОЖДЕНИЕ ПАМЯТИ, приводит к тому что программа вываливается
    m_Log=tempLog;
 
    m_Log[m_LogNr].m_Date=when;
    m_Log[m_LogNr].m_Driver=who;
 
    m_LogNr++;
}

Любопытно что этот код крашиться и в vs2010, но если поменять delete [] m_Log на this->~CCar() (а деструктор как видно в коде какраз таки и выполняет delete [] m_Log) то код не будет вываливаться в vs2010 (в minigw всё равно будет вываливаться). Разве это не чудо? Но сдаваться это всё будет на g++ так что vs2010 здесь не аргумент.

Пытаюсь увеличивать ту память что была уже у меня через realloc:
realloc возвращает NULL (первый раз у меня такое чтобы он не справился)
показать код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//проблемы появляются здесь так как здесь происходит утечка памяти
void CCar::usingCar(CDriver* who, const string& when)
{
    if(m_LogNr==0) //память уже была выделена конструктором для первого элемента
    {
        m_Log[0].m_Driver=who;
        m_Log[0].m_Date=when;
 
        m_LogNr++;
        return;
    }
    //иначе нужно выделить память под массив на 1 больше чем был
 
    m_Log= (TLog*) realloc(m_Log,sizeof(m_Log[0])*(m_LogNr+1));
    
    if(!m_Log) //эта ветка выполняется
     cout<<"ERRROR! REALLOC RETURN 0!";
 
    m_Log[m_LogNr].m_Date=when;
    m_Log[m_LogNr].m_Driver=who;
 
    m_LogNr++;
}


Так что же мне делать, подскажите пожалуйста
Подозреваю что проблемы со структурой из-за того что в структуре строка string, но какое-то же решение должно быть...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru