LinuxForum.Fans
Тема

Выделение памяти для класса с динамическим массивом

Автор: dedm0zaj 10 сообщений 3412 просмотров
#260181

Имеется класс (например, MyClass), поле которого представляют собой динамический массив (например, int *a). Размерность этого массива и выделение для него памяти осуществляется в конструкторе класса: a = new int[N]. По мере работы класса количество элементов массива "а" может меняться, а значит происходит перевыделение памяти для данного массива.

Объявляется класс тоже как динамический массив, ибо количество эелементов заранее неизвество и по мере выполнения программы размерность массива будет меняться.

например:

MyClass *MyCl;
MyCl = new MyClass[M];

так вот мне непонятно, как это реализовать. По идее нужно пересчитывать всю выделяемую память даже при изменении размерности внутриклассового массива "а", но это же геморой. И реально ли это вообще реализовать?

#260188

не понял.... больше кода в студию....

#260196

допустим есть класс

text

class MyClass
{
    int *a;
public:
    MyClass() { a = new int[10] }
    Resize_a(); //допустим, что этим методом перевыделяется память для "а"
};

...

int main() { MyClass *MyCl; MyCl = new MyClass[10]; //и далее по мере работы программы количество элементов данного массива тоже меняется ... }

проблемы:
1. "MyCl = new MyClass[10];" в принципе нельзя писать, потому что для "int *a;" выделится памяти, как для указателя. а как по другому это сделать, я пока додумать не могу.
2. если происходит перевыделение памяти для массива "а" методом Resize_a, то получается, что нужно перевыделять память и для массива "MyCl". как это сделать, тоже пока не понимаю.

зы для изменения количества элементов динамического массива я выделяют память для нового динмассива, копирую туда командой memcpy содержимое старого динмассива и удаляю старый динмассив.

#260202
"dedm0zaj" написал:
MyCl = new MyClass[10];

здесь создаётся массив в куче из 10 объектов MyClass. для каждого из них вызывается конструктор по умолчанию, который создаёт массив в куче длинной 10 и инициализирует его адресом указатель *a.

сами вопросы какие-то бессмысленные.

#260248

даже так? но это даже проще.

а вот теперь допустим ситуация:

мне требуется увеличить массив MyCl на несколько элементов.

по идее, мы должны создать новый массив (с новым количеством элементов в нём), скопировать туда всё из старого массива и удалить старый массив.

так. значит при создании нового массива мы должны учесть количесво элементов массива "а" в каждом объекте старого массива MyCl.

вроде всё понятно, но как то мне это кажется запутанным. как будто есть способ проще. ведь полей в классе MyClass может быть много, да и не факт, что мы сможем узнать количество элементов каждого массива. надо ещё подумать...

#260249

можно ещё перед изменением размера массива MyCl создать массив указателей и скопировать в него адреса массивов "а" каждого объекта MyCl.

а потом, после сознания нового массива, новым "а" присвоить указатели из вышесозданного массива указателей.

но при этом нельзя будет прописать в деструкторе класса MyClass удаление памяти массива "а": delete [] а. и придётся делать это вручную каким нить методом.

#260253
"dedm0zaj" написал:
так. значит при создании нового массива мы должны учесть количесво элементов массива "а" в каждом объекте старого массива MyCl.

зависит от реализации копирующего конструктора или оператора равно, но ИРЛ такое не встречается т.к. объекты-массивы делают не копируемыми, а если нужен массив таких объектов, то в нём хранятся указатели(явно или нет).

#260257
"dedm0zaj" написал:
по идее, мы должны создать новый массив (с новым количеством элементов в нём), скопировать туда всё из старого массива и удалить старый массив.

1. ТОлько осознал, что я в свое время на плюсах делал по сишному в подобной ситуации. Правда у меня был не массив объектов, а работа с набором байтов. Но, почему бы не воспользоваться:
malloc, realloc ....? Это раз.
2. Может задача позволяет создать двусвязный/односвязный список?
3. Если воспользоваться готовыми решениями . Например использовать векторы?

А каждый раз создавать новый массив и копировать старый... Имхо это жесть.

#260260

Используйте стандартную библиотеку шаблонов STL

Войдите или зарегистрируйтесь, чтобы ответить.