Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как передать аргументы в конструктор при выделении памяти для массива объектов?

#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; } }; template struct with_arg : T { with_arg() : T(val) {} }; int main() { A *a = new with_arg [10]; delete [] a; return 0; } Обсуждение наличия UB в этом коде: Можно ли игнорировать пустого наследника при арифметике указателей? Можно ли игнорировать пустого наследника при написании деструктора?

Ответ 3



#include int 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)); //___ } //и еще template struct A{ char * buf; A(){ buf = new char[i + 1]; } }; int main() { A* p = new A<10>[10]; p[0].buf[0] = 't'; //_ _ _ }

Комментариев нет:

Отправить комментарий