Специфичные для COM коды ошибок вы можете посмотреть на на сайте разработчика Microsoft .
Ваша конкретная ошибка 0x80070057
- это общая [COM] ошибка E_INVALIDARG
, в основном один или несколько аргументов неверны.
Чтобы ответить на ваш вопрос, описания, понятные человеку, могут решать, документировать или нет архитектор указанной библиотеки. Вызовы COM обычно имеют приличную документацию о том, куда обращаться в случае ошибки, но найти их сложно.
Когда дело доходит до отладки ошибок, это снова зависит от документации, поставляемой с библиотекой.
TL; DR
Проверьте документацию или Google. Вы находитесь во власти создателя библиотеки.
std::vector<double>(n).swap(vec);
После этого vec, как гарантируют, будет иметь размер и способность n со всеми значениями 0.0.
Возможно, более идиоматический путь начиная с C++ 11
vec.assign(n, 0.);
vec.shrink_to_fit();
со второй дополнительной строкой. В случае, где vec
начинается с больше, чем n
элементы, звонить ли shrink_to_fit
компромисс между содержанием на большую память, чем требуется по сравнению с выполнением перераспределения.
Хорошо давайте закруглим способы сделать это :)
vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
std::vector<double>(n).swap(vec);
Это имеет преимущество фактического уплотнения Вашего вектора также. (В Вашем первом примере, clear()
не гарантирует, что уплотнил Ваш вектор.)
Ни один из фрагментов кода, которые Вы отправили, не делает освобождения памяти, таким образом, они примерно равны.
Прием подкачки, который все остальные продолжают отправлять, займет больше времени для выполнения, потому что он освободит память, первоначально используемую вектором. Это может или не может быть желательно.