У меня в коде часто повторяется фрагмент:
TCHAR text[10] = {};
Convert(window, id1, text);
Я его хочу вынести в отдельную функцию, которая будет возвращать указатель на text.
TCHAR* Foo(HWND window, int id)
{
TCHAR *text = new TCHAR[10];
Convert(window, id, text);
return text;
}
Когда надо будет освободить память, мне не известно. Поэтому, я воспользовалась умными указателями:
std::shared_ptr<TCHAR> Foo(HWND window, int id)
{
std::shared_ptr<TCHAR> text;
Convert(window, id, text); //no suitable conversion function from
//"std::shared_ptr<TCHAR>" to "TCHAR *"
return text;
}
void Convert(HWND window, int ID, TCHAR* text, int size=10)
{
HWND handle = GetDlgItem(window, ID);
GetWindowText(handle, text, size);
}
Как выделить память на 10 элементов и решить проблему с преобразованием?
Чтобы std::shared_ptr правильно работал с массивами, для него нужно задать пользовательский deleter. Или, если Ваш компилятор поддерживает c++17, то можно параметризовать std::shared_ptr типом массива, например, TCHAR[] (спасибо за уточнение GreenDragon). Иначе в коде появляется UB, т.к. освобождение объекта будет происходить через delete, а не delete[] как это требуется после выделения памяти через new[].
В данном случае общее владение в принципе не требуется, поэтому можно воспользоваться специализацией std::unique_ptr для массивов. Однако зная специфику Вашей функции Convert можно было бы посоветовать вовсе отказаться от ручного управления памятью и умных указателей в частности, и использовать std::basic_string<TCHAR>, например.
Т.е. я бы предложил переделать Convert как-то так:
std::basic_string<TCHAR> Convert(HWND window, int ID)
{
HWND handle = GetDlgItem(window, ID);
std::basic_string<TCHAR> ret(GetWindowTextLength(handle) + 1, _T(' '));
GetWindowText(handle, ret.data(), ret.size());
return ret;
}
Но может быть тут надо учесть ещё какие-то особенности WinAPI.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники