Как создать (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...);
}