#cpp #массивы
Есть структура: struct A{ char * buf; A(int size){ buf = new char[size]; } }; Хочу создать массив объектов A с указанным размером. A * a = new A[10](10); // 10 объектов, должны конструироваться через A(int size) но никак не получается.
Ответы
Ответ 1
Если нет уж очень принципиальной потребности полагаться на сырые new, то можно использовать std::vector и один из его конструкторов: std::vector v(10, A(10)); Правда в этом случае объект создается указанным конструктором один раз, а далее уже происходит копирование. То есть нужно написать подходящий копирующий конструктор.Ответ 2
Сильно подозреваю, что UB, но можно попорбовать что-то такое: https://ideone.com/PlWjPh struct A { char *buf; A(int size) : buf(new char[size]) {} ~A() { delete [] buf; } }; templatestruct with_arg : T { with_arg() : T(val) {} }; int main() { A *a = new with_arg [10]; delete [] a; return 0; } Обсуждение наличия UB в этом коде: Можно ли игнорировать пустого наследника при арифметике указателей? Можно ли игнорировать пустого наследника при написании деструктора? Ответ 3
#includeint main() { struct A{ ~A() { delete [] buf; buf = nullptr; } A( int size ) { buf = new char[ size ]; } char * buf; }; //выделяем A* ptr = (A*)(::operator new[](sizeof(A) * 10)); for(auto i=0; i<10; ++i) { new(ptr + i) A(10); } //освобождаем for(auto i=0; i<10; ++i) (ptr + i)->~A(); ::operator delete[](ptr, sizeof(A)*10); return 0; } Ответ 4
//еще вариант int main() { //___ A* aptr = static_cast(operator new [](sizeof(A) * 10)); //___ } //и еще templatestruct A{ char * buf; A(){ buf = new char[i + 1]; } }; int main() { A* p = new A<10>[10]; p[0].buf[0] = 't'; //_ _ _ }
Комментариев нет:
Отправить комментарий