Динамический массив объектов класса...
От: .alex Ниоткуда  
Дата: 28.12.23 13:13
Оценка: -2
Добрый день. Извиняюсь, но что-то всё забыл совсем совсем) Подскажите, как правильнее сделать динамический массив объектов без векторов и пр...
Первым способом или вторым?
#include <iostream>
#include <string>


class Zzz
{
    public:
    Zzz()
    {
        s = "class str";
    }    
    void Print(int n)
    {
        std::cout << s << "\t" << std::to_string(n) << std::endl;
    }
    std::string s;
    int n;
};


void main()
{
    // way1
    Zzz* arr = new Zzz[5];
    for (int i = 0; i < 5; i++)    arr[i].Print(i);
    delete[] arr;

    // way2
    Zzz** arr2 = new Zzz* [5];
    for (int i = 0; i < 5; i++)
    {
        arr2[i] = new Zzz;
        arr2[i]->Print(i);
    }
    for (int i = 0; i < 5; i++) delete arr2[i];
    delete[] arr2;

    return;
}
Re: Динамический массив объектов класса...
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.12.23 13:18
Оценка:
Здравствуйте, .alex, Вы писали:

A>Добрый день. Извиняюсь, но что-то всё забыл совсем совсем) Подскажите, как правильнее сделать динамический массив объектов без векторов и пр...

A>Первым способом или вторым?

Во втором случае имеет место быть динамаческий массив указателей на объекты
Маньяк Робокряк колесит по городу
Re: Динамический массив объектов класса...
От: kov_serg Россия  
Дата: 28.12.23 13:19
Оценка:
Здравствуйте, .alex, Вы писали:

A>Первым способом или вторым?

Если объёктов класса то вторым.
А если класс только один без наследников то пофиг.
Re[2]: Динамический массив объектов класса...
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.12.23 13:19
Оценка:
Здравствуйте, Marty, Вы писали:

M>Во втором случае имеет место быть динамаческий массив указателей на объекты


Они хоть переконструироваться не будут при реаллокации...
Re[3]: Динамический массив объектов класса...
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.12.23 13:32
Оценка: +1
Здравствуйте, Pzz, Вы писали:

M>>Во втором случае имеет место быть динамаческий массив указателей на объекты


Pzz>Они хоть переконструироваться не будут при реаллокации...


А переаллокация будет?

Ну и там ничего такого тяжелого нет, пусть бы и пересоздавались. Хотя, по уму, их надо перемещать в таком случае
Маньяк Робокряк колесит по городу
Re[2]: Динамический массив объектов класса...
От: .alex Ниоткуда  
Дата: 28.12.23 13:38
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, .alex, Вы писали:


A>>Первым способом или вторым?

_>Если объёктов класса то вторым.
_>А если класс только один без наследников то пофиг.

Да, никаких наследников и переаллокаций... Ну т.е. если все равно буду первым способом — писанины меньше...
Всем спасибо!
Re: Динамический массив объектов класса...
От: K13 http://akvis.com
Дата: 29.12.23 05:47
Оценка: +1
A>как правильнее сделать динамический массив объектов без векторов и пр...

просто взять std::vector и не парить себе мозги. std::string никого не смущает, а вектор вдруг под запрет попал...
Re[2]: Динамический массив объектов класса...
От: Wawan Россия http://www.wawan.ru/resume
Дата: 29.12.23 11:43
Оценка:
Здравствуйте, K13, Вы писали:
A>>как правильнее сделать динамический массив объектов без векторов и пр...
K13>просто взять std::vector и не парить себе мозги. std::string никого не смущает, а вектор вдруг под запрет попал...

он когда строку будет делать то как раз вектор и возьмет, это же с++, тут не ищут легких путей
Re[2]: Сортировка групами
От: .alex Ниоткуда  
Дата: 30.12.23 20:14
Оценка:
Здравствуйте, K13, Вы писали:

A>>как правильнее сделать динамический массив объектов без векторов и пр...


K13>просто взять std::vector и не парить себе мозги. std::string никого не смущает, а вектор вдруг под запрет попал...

string просто для примера в оригинальном классе только POD типы...
Re: Динамический массив объектов класса...
От: fk0 Россия https://fk0.name
Дата: 18.01.24 20:51
Оценка:
Здравствуйте, .alex, Вы писали:

A>Добрый день. Извиняюсь, но что-то всё забыл совсем совсем) Подскажите, как правильнее сделать динамический массив объектов без векторов и пр...


int *array = ::operator new(sizeof(int[100500]));
Re[2]: Динамический массив объектов класса...
От: CreatorCray  
Дата: 18.01.24 22:22
Оценка:
Здравствуйте, fk0, Вы писали:

fk0> int *array = ::operator new(sizeof(int[100500]));

Ugh. А нафига так сложно то?

int* foo = new int [100500];
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[3]: Динамический массив объектов класса...
От: fk0 Россия https://fk0.name
Дата: 19.01.24 15:43
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, fk0, Вы писали:


fk0>> int *array = ::operator new(sizeof(int[100500]));

CC>Ugh. А нафига так сложно то?

CC>
CC>int* foo = new int [100500];
CC>


Так память будет лишний раз инициализироваться и удалять через delete[] потом неудобно.
Re[4]: Динамический массив объектов класса...
От: sergii.p  
Дата: 23.01.24 09:42
Оценка:
Здравствуйте, fk0, Вы писали:

fk0> Так память будет лишний раз инициализироваться и удалять через delete[] потом неудобно.


то есть написать delete[] западло, а static_cast<int*>(::operator new(sizeof(int[100]))) нормально?
Ну и для int компилятор генерирует одинаковый код: лишней инициализации не происходит. Для пользовательских объектов возможно и имеет смысл так шаманить.
Re[5]: Динамический массив объектов класса...
От: fk0 Россия https://fk0.name
Дата: 24.01.24 10:51
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Здравствуйте, fk0, Вы писали:


fk0>> Так память будет лишний раз инициализироваться и удалять через delete[] потом неудобно.


SP>то есть написать delete[] западло, а static_cast<int*>(::operator new(sizeof(int[100]))) нормально?


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

SP>Ну и для int компилятор генерирует одинаковый код: лишней инициализации не происходит. Для пользовательских объектов возможно и имеет смысл так шаманить.


В смысле не происходит. А кто будет массив инициализировать? Там дефолтный конструктор
"вызовется" как бы для каждого элемента. На большом массиве это значит вызов memset(),
которого можно избежать.
Re[6]: Динамический массив объектов класса...
От: sergii.p  
Дата: 24.01.24 11:49
Оценка: +2
Здравствуйте, fk0, Вы писали:

fk0> В момент удаления может быть неизвестно, что за объект там и как его удалять.

fk0>И удобней иметь такой, для которого можно просто освободить память.

тяжело такое представить. Можно пример?

fk0> В смысле не происходит. А кто будет массив инициализировать?


Пушкин?

Default-initialization of non-class variables with automatic and dynamic storage duration produces objects with indeterminate values (static and thread-local objects get zero initialized).


https://en.cppreference.com/w/cpp/language/default_initialization#Notes

и

If type is an array type, an array of objects is initialized:
If new-initializer is absent, each element is default-initialized.


https://en.cppreference.com/w/cpp/language/new#Initialization

так можно проверить:

int dummy[100] = {0xDD};
int* array = new (dummy) int [100];
std::cout << std::hex << array[0];


распечатает dd. Т.е. никакого memset не происходит.
Re[4]: Динамический массив объектов класса...
От: CreatorCray  
Дата: 24.01.24 17:22
Оценка:
Здравствуйте, fk0, Вы писали:

fk0> Так память будет лишний раз инициализироваться

С какого вдруг перепугу?

fk0> и удалять через delete[] потом неудобно.

Huh?

delete [] foo;


... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.