Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231

Расширение динамически созданного массива объектов

22.06.2015, 15:51. Показов 3343. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, как расширить динамический массив без использования STL библиотеки:

C++
1
2
3
4
5
6
7
8
9
10
count = 10;
ClassA** A;
A = new ClassA*[count ];
for (int i = 0; i < count ; i++)
{
    A[i] = new ClassA(10, "1");
}
 
count = 15;
//Как дальше расширить массив
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2015, 15:51
Ответы с готовыми решениями:

Расширение динамического массива объектов
Здравствуйте, форумчане. Моя задача написать функцию,которая добавляет новый объект в динамический массив объектов. Что-то с памятью,...

Возвращение из функции динамически созданного объекта
Доброго всем времени суток! Столкнулся с такой проблемой. Необходимо создать список, при этом использоваться список планируется внутри...

Обработчик событий для динамически созданного массива контролов
Option Explicit Dim WithEvents Button As CommandButton Private Sub Command1_Click() MsgBox &quot;Hi&quot; End Sub Private Sub...

40
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
23.06.2015, 18:14
Студворк — интернет-сервис помощи студентам
Эх, знать бы ещё, зачем это всё )
Вот эти indices, которые живут так недолго?
И почему size не является полем класса?
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
23.06.2015, 18:42
Цитата Сообщение от IrineK Посмотреть сообщение
//новый размер - больший старого
*ClassA **new_arr = new ClassA*[new_size];
//старый размер * *
* * for (size_t i = 0; i < size; ++i)
* * {
* * * * new_arr[i] = arr[i]; //копируем в новый
* * * * delete[] arr[i]; * * * *//удаляем старый
* * }
delete[] arr;
* * arr = NULL;
* * arr = new_arr;
* * size = new_size;
Ещё, по поводу этого кода: новая память, под добавленные указатели, не выделена, старый размер утерян, после этого не определить, под какие указатели память была выделена, а под какие - нет.
1
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
23.06.2015, 20:12
void ReallocClassA(ClassA **&arr, size_t size, size_t new_size)

наверное нужно заменить на

void ReallocClassA(ClassA **arr, size_t size, size_t new_size)

и передавать туда arr
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
23.06.2015, 21:10
Цитата Сообщение от Krock21rus Посмотреть сообщение
void ReallocClassA(ClassA **&arr, size_t size, size_t new_size)
наверное нужно заменить на
void ReallocClassA(ClassA **arr, size_t size, size_t new_size)
и передавать туда arr
Хватит хрень писать.
1
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
23.06.2015, 23:48
lss, могу сказать вам то же самое
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
24.06.2015, 00:41

Не по теме:

Цитата Сообщение от Krock21rus Посмотреть сообщение
могу сказать вам то же самое
Сказать можешь, обосновать не получится.

Прежде, чем предлагать передавать arr по значению, глаза разуй и посмотри, что в ReallocClassA() происходит с arr.

Добавлено через 56 секунд

Не по теме:

Где на тебя не наткнёшься на форуме, везде хрень всякую пишешь.

1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
24.06.2015, 02:13  [ТС]
lss

Не по теме:


Цитата Сообщение от lss Посмотреть сообщение
Не по теме:
Где на тебя не наткнёшься на форуме, везде хрень всякую пишешь.
аахахахахахаха


Ладно, спасибо всем, программа работает, утечек памяти нет -> можно больше не напрягаться по этому поводу =)
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
24.06.2015, 02:30
Цитата Сообщение от Helldrg Посмотреть сообщение
программа работает, утечек памяти нет
Интересно было бы код посмотреть.
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
24.06.2015, 05:17  [ТС]
lss
Вот пример с буфером вершин
Кликните здесь для просмотра всего текста
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
//***************************************************************************
// indexbufferclass.h
//
//***************************************************************************
#pragma once
#ifndef INDEXBUFFERCLASS_H
#define INDEXBUFFERCLASS_H
 
#include "..\\logclass.h"
 
class IndexBufferClass
{
public:
    IndexBufferClass(ID3D11Device*, LogClass*);
    bool Initialize(int);
    ID3D11Buffer* GetIndexBuffer();
    int GetCountIndex();
    void Shutdown();
private:
    ID3D11Buffer* m_indexBuffer;
    int m_countIndex;
 
    ID3D11Device* m_device;
    LogClass* m_Log;
};
 
#endif
 
 
//***************************************************************************
// indexbufferclass.cpp
//
//***************************************************************************
#include "indexbufferclass.h"
 
IndexBufferClass::IndexBufferClass(ID3D11Device* device, LogClass* Log)
{
    m_device = device;
    m_Log = Log;
}
 
bool IndexBufferClass::Initialize( int countIndex)
{
    HRESULT hr;
    unsigned long* indices;
    D3D11_BUFFER_DESC indexBufferDesc;
    D3D11_SUBRESOURCE_DATA indexData;
 
    m_countIndex = countIndex;
 
    indices = new unsigned long[countIndex];
    for (int i = 0; i < countIndex; i++)
    {
        indices[i] = i;
    }
 
    indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    indexBufferDesc.ByteWidth = sizeof(unsigned long) * countIndex;
    indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    indexBufferDesc.CPUAccessFlags = 0;
    indexBufferDesc.MiscFlags = 0;
    indexBufferDesc.StructureByteStride = 0;
 
 
    indexData.pSysMem = indices;
    indexData.SysMemPitch = 0;
    indexData.SysMemSlicePitch = 0;
 
    hr = m_device->CreateBuffer(&indexBufferDesc, &indexData, &m_indexBuffer);
    if (FAILED(hr))
    {
        m_Log->Write(1, "Error", "Buffer not сreated", "indexbufferclass.cpp");
        return false;
    }
 
    delete[] indices;
    indices = 0;
 
    return true;
}
 
ID3D11Buffer* IndexBufferClass::GetIndexBuffer()
{
    return m_indexBuffer;
}
 
int IndexBufferClass::GetCountIndex()
{
    return m_countIndex;
}
 
void IndexBufferClass::Shutdown()
{
    if (m_indexBuffer)
    {
        m_indexBuffer->Release();
    }
}
 
//***************************************************************************
// managerresourceclass.h
//
//***************************************************************************
#pragma once
#ifndef MANAGERRESOURCECLASS_H
#define MANAGERRESOURCECLASS_H
 
#include "logclass.h"
#include "Resource\indexbufferclass.h"
 
class ManagerResourceClass
{
public:
    enum ResourceType
    {
        INDEX_BUFFER = 0
    };
public:
    ManagerResourceClass(ID3D11Device*, ID3D11DeviceContext*, HWND*, LogClass*);
    bool InitData(ResourceType, int);
    void Shutdown();
 
    template< typename T > void CreateData(T**&, ResourceType, int);
 
    IndexBufferClass* GetIndexBuffer(int);
private:
    ID3D11Device* m_device;
    ID3D11DeviceContext* m_deviceContext;
    LogClass* m_Log;
    HWND* m_hWnd;
    int m_countResource;
 
    int* m_countData;
    IndexBufferClass** m_IndexBuffer;
};
 
#endif
 
 
 
//***************************************************************************
// managerresourceclass.cpp
//
//***************************************************************************
#include "managerresourceclass.h"
 
template< typename T >
void ManagerResourceClass::CreateData(T **&object, ResourceType resource, int countData)
{
    if (m_countData[resource] == 0)
    {
        m_countData[resource] = countData;
        object = new T*[countData];
        for (int i = 0; i < countData; i++)
        {
                object[i] = new T(m_device, m_Log);
        }
    }
    else
    {
        ReallocInt(object, m_countData[resource], countData);
        for (int i = m_countData[resource]; i < countData; i++)
        {
                object[i] = new T(m_device, m_Log);
        }
        m_countData[resource] = countData;
    }
}
 
ManagerResourceClass::ManagerResourceClass(ID3D11Device* device, ID3D11DeviceContext* deviceContext, HWND* hWnd, LogClass* Log)
{
    m_device = device;
    m_deviceContext = deviceContext;
    m_Log = Log;
    m_hWnd = hWnd;
    m_countResource = 1;
    m_countData = new int[m_countResource];
    for (int i = 0; i < m_countResource; i++)
        m_countData[i] = 0;
}
 
bool ManagerResourceClass::InitData(ResourceType resource, int countData)
{
    if (countData == 0)
    {
        m_Log->Write(1, "UsersError", "The number of created objects should not be 0!", "Replace the 0 to a positive integer (x > 0).", "main.cpp");
        return false;
    }
 
    if (resource == INDEX_BUFFER)
    {
        CreateData(m_IndexBuffer, INDEX_BUFFER, countData);
    }
    else
    {
        m_Log->Write(1, "UsersError", "Resource name is incorrect!", "Replace the name to a name from ResourceType list.", "main.cpp");
        return false;
    }
    
    return true;
}
 
IndexBufferClass* ManagerResourceClass::GetIndexBuffer(int num)
{
    return m_IndexBuffer[num];
}
 
PictureClass* ManagerResourceClass::GetPicture(int num)
{
    return m_Picture[num];
}
 
void ManagerResourceClass::Shutdown()
{
    if (m_IndexBuffer)
    {
        for (int i = 0; i < m_countData[INDEX_BUFFER]; i++)
        {
            m_IndexBuffer[i]->Shutdown();
            delete[] m_IndexBuffer[i];
        }
    }
    delete[] m_IndexBuffer;
 
    delete[] m_countData;
}
 
.....
 
//***************************************************************************
// functionclass.h
//
//***************************************************************************
#pragma once
#ifndef FUNCTIONCLASS_H
#define FUNCTIONCLASS_H
 
 
template< typename T >
void ReallocInt(T **&arr, int size, int new_size)
{
    T **new_arr = new T*[new_size];
    //size = size < new_size ? size : new_size;
 
    for (int i = 0; i < size; ++i)
    {
        new_arr[i] = arr[i];
    }
    
    delete[] arr;
 
    arr = new_arr;
}
 
#endif
......
 
 
 
 
main.cpp 
 
 
.....
 
ManagerResourceClass* m_ManagerResource; 
IndexBufferClass* m_IndexBuffer;
 
m_ManagerResource = new ManagerResourceClass(m_device, m_deviceContext, &m_hWnd, m_Log);
m_ManagerResource->InitData(ManagerResourceClass::ResourceType::INDEX_BUFFER, 1);
m_IndexBuffer = m_ManagerResource->GetIndexBuffer(0);
result = m_IndexBuffer->Initialize(6);
if (result == false)
{
    return false;
}
 
 
 
m_ManagerResource->Shutdown();
delete m_ManagerResource;
 
.....
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
24.06.2015, 05:37
Меня вот этот кусок интересовал:
C++
1
2
3
4
5
6
7
ReallocInt(object, m_countData[resource], countData);
        
for (int i = m_countData[resource]; i < countData; i++)
{
    object[i] = new T(m_device, m_Log);
}
m_countData[resource] = countData;
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
24.06.2015, 05:41  [ТС]
lss
Правильно у меня?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
24.06.2015, 05:54
В общем, да. Новый размер всегда не меньше старого? Может быть равен старому?
1
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
24.06.2015, 09:01
Если новый размер меньше, пойдут утечки.

По-моему, список вместо резинового массива был бы естественней для решения.
1
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
24.06.2015, 09:11
lss, вы не обьяснили в чём ошибка
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
24.06.2015, 17:10  [ТС]
IrineK
Я знаю, я в процессе завершения написания этого класса, обработку таких ошибок я уже сделал, единственно что бы я добавил это аллокатор памяти, но как бы я не представлял он не вписывается в класс
lss
Я доработал это уже, теперь если равен и если меньше старого в лог запишется ошибка
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
24.06.2015, 18:57

Не по теме:

Цитата Сообщение от Krock21rus Посмотреть сообщение
вы не обьяснили в чём ошибка
Чья? Твоя? А ты спрашивал, или советы ТС давал?



Добавлено через 2 минуты
Цитата Сообщение от IrineK Посмотреть сообщение
Если новый размер меньше, пойдут утечки.
IrineK, вы продолжаете, в этой теме, что-то странное писать. Какие там утечки? Этот код (имею ввиду, перевыделение памти) просто не предназначен для таких случаев.

Добавлено через 1 минуту
Цитата Сообщение от Helldrg Посмотреть сообщение
Я доработал это уже, теперь если равен и если меньше старого в лог запишется ошибка
И всё? А ReallocInt() и CreateData() как в этом случае выглядят? Или до них, в этих случаях, просто не доходит?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
24.06.2015, 19:12
Цитата Сообщение от lss Посмотреть сообщение
Какие там утечки?
Где там?
Без поставленной задачи о её решении вообще говорить забавно.
Если у ТС всё получилось - а он единственный реально знает, о чём речь - то и хорошо.
0
lss
24.06.2015, 19:53

Не по теме:

Цитата Сообщение от IrineK Посмотреть сообщение
Где там?
Там, где память перевыделяется. Или вы видите ещё где-то возможные утечки? Если да, то где?
Цитата Сообщение от IrineK Посмотреть сообщение
Без поставленной задачи о её решении вообще говорить забавно.
Так зачем говорите о каких-то учечках? Повторюсь: странное пишите.

0
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
24.06.2015, 20:16  [ТС]
lss
Я почему тему и создал, у меня студия выводила, что в программе существует утечка памяти, но проблема решена, спасибо большое за помощь =)

Цитата Сообщение от lss Посмотреть сообщение
И всё? А ReallocInt() и CreateData() как в этом случае выглядят? Или до них, в этих случаях, просто не доходит?
Не доходит до них
1
lss
24.06.2015, 20:28

Не по теме:

Цитата Сообщение от Helldrg Посмотреть сообщение
Я почему тему и создал, у меня студия выводила, что в программе существует утечка памяти,
Это по поводу того, что IrineK пишет? Или к чему? Тогда код другой был, а не тот который был показан в 20 посте.

Добавлено через 3 минуты
IrineK, а реагировать на замечания по коду, из 15 поста, звание эксперта не позволяет?

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2015, 20:28

Динамически не подключаются нужные файлы из массива объектов.
Привет всем! Уже который день ломаю голову над следующей задачей. jsLoad = { js : function(file,callback) { (function(){ ...

Удаление динамически созданного контрола
Создаю новый label... переменная I2-это количество созданных контролов,также используется для имени нового контрола... Label lb; int...

Удаление динамически созданного объекта
Код создания объекта: procedure TForm1.Book_Create(Sender: TObject); begin img := TImage.Create(ScrollBox1); img.Parent :=...

Удаление динамически созданного контрола
Здравствуйте уважаемые форумчани. Проблема в следующем, динамически создаю контролы, вот таким образом private void...

Поле динамически созданного Edit-a
Разбирался с динамическим созданием компонентов и наткнулся на проблему: из созданного Edit-а не копируется текст. void __fastcall...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru