Добрый день. Извиняюсь, но что-то всё забыл совсем совсем) Подскажите, как правильнее сделать динамический массив объектов без векторов и пр...
Первым способом или вторым?
#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;
}
Здравствуйте, 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).
Здравствуйте, Pzz, Вы писали:
M>>Во втором случае имеет место быть динамаческий массив указателей на объекты
Pzz>Они хоть переконструироваться не будут при реаллокации...
А переаллокация будет?
Ну и там ничего такого тяжелого нет, пусть бы и пересоздавались. Хотя, по уму, их надо перемещать в таком случае
Здравствуйте, .alex, Вы писали:
A>Добрый день. Извиняюсь, но что-то всё забыл совсем совсем) Подскажите, как правильнее сделать динамический массив объектов без векторов и пр... A>Первым способом или вторым?
Во втором случае имеет место быть динамаческий массив указателей на объекты
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, .alex, Вы писали:
A>>Первым способом или вторым? _>Если объёктов класса то вторым. _>А если класс только один без наследников то пофиг.
Да, никаких наследников и переаллокаций... Ну т.е. если все равно буду первым способом — писанины меньше...
Всем спасибо!
Здравствуйте, K13, Вы писали: A>>как правильнее сделать динамический массив объектов без векторов и пр... K13>просто взять std::vector и не парить себе мозги. std::string никого не смущает, а вектор вдруг под запрет попал...
он когда строку будет делать то как раз вектор и возьмет, это же с++, тут не ищут легких путей
Здравствуйте, K13, Вы писали:
A>>как правильнее сделать динамический массив объектов без векторов и пр...
K13>просто взять std::vector и не парить себе мозги. std::string никого не смущает, а вектор вдруг под запрет попал...
string просто для примера в оригинальном классе только POD типы...
Здравствуйте, .alex, Вы писали:
A>Добрый день. Извиняюсь, но что-то всё забыл совсем совсем) Подскажите, как правильнее сделать динамический массив объектов без векторов и пр...
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, fk0, Вы писали:
fk0>> int *array = ::operator new(sizeof(int[100500])); CC>Ugh. А нафига так сложно то?
CC>
CC>int* foo = new int [100500];
CC>
Так память будет лишний раз инициализироваться и удалять через delete[] потом неудобно.
Здравствуйте, fk0, Вы писали:
fk0> Так память будет лишний раз инициализироваться и удалять через delete[] потом неудобно.
то есть написать delete[] западло, а static_cast<int*>(::operator new(sizeof(int[100]))) нормально?
Ну и для int компилятор генерирует одинаковый код: лишней инициализации не происходит. Для пользовательских объектов возможно и имеет смысл так шаманить.
Здравствуйте, sergii.p, Вы писали:
SP>Здравствуйте, fk0, Вы писали:
fk0>> Так память будет лишний раз инициализироваться и удалять через delete[] потом неудобно.
SP>то есть написать delete[] западло, а static_cast<int*>(::operator new(sizeof(int[100]))) нормально?
В момент удаления может быть неизвестно, что за объект там и как его удалять.
И удобней иметь такой, для которого можно просто освободить память.
SP>Ну и для int компилятор генерирует одинаковый код: лишней инициализации не происходит. Для пользовательских объектов возможно и имеет смысл так шаманить.
В смысле не происходит. А кто будет массив инициализировать? Там дефолтный конструктор
"вызовется" как бы для каждого элемента. На большом массиве это значит вызов memset(),
которого можно избежать.
Здравствуйте, fk0, Вы писали:
fk0> Так память будет лишний раз инициализироваться
С какого вдруг перепугу?
fk0> и удалять через delete[] потом неудобно.
Huh?