Как создать (MSVS, native c++) std::unique_ptr или std::shared_ptr на массив объектов, у класса которых нет default ctr?

Только не надо объяснять, что vector лучше (Win API с векторами как-то не очень...)


Ответы (2 шт):

Автор решения: Chorkov

Вы хотите использовать умные указатели, для типов, которые должны аллоцироваться и удаляться вызовами WinAPI? Т.е. вопрос как привязать собственную функцию удаления к умным указателям?

struct Foo;
Foo* makeFoo();
void destroyFoo(Foo* foo); // Какая-то функция деструкции у вас должна быть.




std::shared_ptr<Foo> sharedFoo( makeFoo(),   
                               destroyFoo // Второй аргумент конструктора  - функция деструкции
                             );


struct FooDeleter{ 
   void operator() ( Foo* f ) { destroyFoo(f); }
};
std::unique_ptr<Foo, 
                FooDeleter // Второй аргумент шаблона - deleter_type
 > uniqueFoo( makeFoo() );
→ Ссылка
Автор решения: gbg

Чтобы создать вектор одинаковых элементов без кучи копирований, следует сделать следующее:

std::vector<Foo> vec; 
vec.reserve(cnt);           //выделили память под все
                            //элементы. Конструкторы при этом не нужны
                            //так как элементы НЕ создаются
for(size_t i=0;i!=cnt;++i)
{
    //элементы создаются прямо внутри вектора, лишних 
    //копирований не будет
    //в качестве параметров указываются параметры, которые будут 
    //переданы в конструктор
    vec.emplace_back(ctr_parameter1, ctr_parameter2, etc...);     
}
→ Ссылка