Я использую функцию C, которая имеет подпись как unique_ptr my_array
с std::unique_ptr
так, чтобы автоматически называться free
? Я не могу изменить функцию C (которая является частью внешней библиотеки), поэтому я не могу изменить структуру данных, используемую в ней.обработку для двойного указателя
Существует similar question on SO, но в этом вопросе функция C вернула указатель, и вокруг этого возвращаемого значения было создано unique_ptr
. Некоторые из предложенных ответов будет работать, если немой указатель был создан первым, а затем завернутые позже, например:
double * my_array;
size_t array_length = load_array(source, &my_array);
auto my_array_wrapper = std::unique_ptr<double, decltype(free)*>{ my_array, free };
// ... do stuff with my_array_wrapper ...
// free() called on wrapped pointer when my_array_wrapper goes out of scope
Это не кажется очень чистым для меня, так как я до сих пор оригинальный указатель валяется в моей код. То, что я хотел бы сделать, чтобы полностью содержать указатель, с чем-то вроде:
clever_ptr my_clever_array;
size_t array_length = load_array(source, my_clever_array.get_ptr_address());
// ... do stuff with my_clever_array ...
// free() called on wrapped pointer when wrapper goes out of scope
Очевидно, что я мог бы написать небольшой класс для этого, но я заинтересован в есть ли существующие утилиты, которые уже предоставляют для этого.
Вы можете, но почему бы вам просто не использовать вектор? –
Возможно, он использует устаревший код C. Как показано выше, он принимает двойной указатель. –
@ H.Guijt Функция C не использует векторные методы, поэтому я не вижу, как это будет работать. Я не могу изменить функцию C. – beldaz