Как удалить указатель после того, как я использую его для возврата в качестве обычной переменной функции ⇐ C++
-
Anonymous
Как удалить указатель после того, как я использую его для возврата в качестве обычной переменной функции
Я рассматривал подобные вопросы, но все они предполагают, что возвращаемый тип также является указателем. Прошу прощения, если это неправильно сформулировано, поскольку я новичок в C++.
Итак, у меня есть следующая функция:
//Преобразует строку в LPCTSTR для диалогового окна LPCTSTR CAnotherAttemptDlg::convertToLPCTSTR(преобразование std::string) { size_t ConvertChars = 0; const size_t newssizew = преобразование.размер() + 1; wchar_t* wcstring = новый wchar_t[newsizew]; mbstowcs_s(&convertedChars, wcstring, newsizew, конверсия.c_str(), _TRUNCATE); вернуть wcstring; } Я уверен, вы заметили, что в качестве результата я возвращаю указатель, однако вывод не должен быть указателем, поэтому я не могу удалить указатель вне функции, удалив указатель, которому он назначен, поскольку он не выводится в указатель. Как лучше всего это сделать?
Примечание: на случай, если меня спросят, что это должно делать, это преобразование строки в LPCTSTR, что аналогично wchar_t*
Изменить: Для пояснения, это блок, вызывающий эту функцию:
BOOL CAnotherAttemptDlg::OnInitDialog() { строковые настройкиLine; LPCTSTR defStrPath = L""; // = "C:\\Ste\\Runtime\\TestFiles"; LPCTSTR defEndPath = L""; // извлекает начальный и конечный пути по умолчанию из FileTrams.ini, анализирует их на соответствующие переменные ifstream settingsStream("FileTrans.ini"); while (getline(settingsStream, settingsLine)) { разделитель строк = "="; строка tokenOne = settingsLine.substr(0, settingsLine.find(разделитель)); строка tokenTwo = settingsLine.substr(settingsLine.find(разделитель) + 1, '10'); если (tokenOne == "startPath") { defStrPath = ConvertToLPCTSTR (tokenTwo); } иначе, если (tokenOne == "endPath") { defEndPath = ConvertToLPCTSTR (tokenTwo); } } настройкиStream.close(); CDialogEx::OnInitDialog(); SetWindowLong(this->m_hWnd, GWL_STYLE, GetWindowLong(this->m_hWnd, GWL_STYLE) | WS_SYSMENU); // Установите значок для этого диалога. Фреймворк делает это автоматически // когда главное окно приложения не является диалогом SetIcon(m_hIcon, ИСТИНА); // Устанавливаем большую иконку SetIcon(m_hIcon, ЛОЖЬ); // Устанавливаем маленькую иконку // ЗАДАЧА: добавить сюда дополнительную инициализацию SetDlgItemText (IDC_MFCEDITBROWSE1, defStrPath); SetDlgItemText (IDC_MFCEDITBROWSE2, defEndPath); вернуть ИСТИНА; // возвращаем TRUE, если вы не установили фокус на элемент управления удалить [] defStrPath; удалить [] defEndPath; }
Я рассматривал подобные вопросы, но все они предполагают, что возвращаемый тип также является указателем. Прошу прощения, если это неправильно сформулировано, поскольку я новичок в C++.
Итак, у меня есть следующая функция:
//Преобразует строку в LPCTSTR для диалогового окна LPCTSTR CAnotherAttemptDlg::convertToLPCTSTR(преобразование std::string) { size_t ConvertChars = 0; const size_t newssizew = преобразование.размер() + 1; wchar_t* wcstring = новый wchar_t[newsizew]; mbstowcs_s(&convertedChars, wcstring, newsizew, конверсия.c_str(), _TRUNCATE); вернуть wcstring; } Я уверен, вы заметили, что в качестве результата я возвращаю указатель, однако вывод не должен быть указателем, поэтому я не могу удалить указатель вне функции, удалив указатель, которому он назначен, поскольку он не выводится в указатель. Как лучше всего это сделать?
Примечание: на случай, если меня спросят, что это должно делать, это преобразование строки в LPCTSTR, что аналогично wchar_t*
Изменить: Для пояснения, это блок, вызывающий эту функцию:
BOOL CAnotherAttemptDlg::OnInitDialog() { строковые настройкиLine; LPCTSTR defStrPath = L""; // = "C:\\Ste\\Runtime\\TestFiles"; LPCTSTR defEndPath = L""; // извлекает начальный и конечный пути по умолчанию из FileTrams.ini, анализирует их на соответствующие переменные ifstream settingsStream("FileTrans.ini"); while (getline(settingsStream, settingsLine)) { разделитель строк = "="; строка tokenOne = settingsLine.substr(0, settingsLine.find(разделитель)); строка tokenTwo = settingsLine.substr(settingsLine.find(разделитель) + 1, '10'); если (tokenOne == "startPath") { defStrPath = ConvertToLPCTSTR (tokenTwo); } иначе, если (tokenOne == "endPath") { defEndPath = ConvertToLPCTSTR (tokenTwo); } } настройкиStream.close(); CDialogEx::OnInitDialog(); SetWindowLong(this->m_hWnd, GWL_STYLE, GetWindowLong(this->m_hWnd, GWL_STYLE) | WS_SYSMENU); // Установите значок для этого диалога. Фреймворк делает это автоматически // когда главное окно приложения не является диалогом SetIcon(m_hIcon, ИСТИНА); // Устанавливаем большую иконку SetIcon(m_hIcon, ЛОЖЬ); // Устанавливаем маленькую иконку // ЗАДАЧА: добавить сюда дополнительную инициализацию SetDlgItemText (IDC_MFCEDITBROWSE1, defStrPath); SetDlgItemText (IDC_MFCEDITBROWSE2, defEndPath); вернуть ИСТИНА; // возвращаем TRUE, если вы не установили фокус на элемент управления удалить [] defStrPath; удалить [] defEndPath; }
Мобильная версия