我已经查阅了类似的问题,但它们都假定返回类型也是一个指针。如果我的描述不够准确,请见谅,因为我对C++还不太熟悉。
我有以下这个函数:
// 将字符串转换为用于对话框的LPCTSTR
LPCTSTR CAnotherAttemptDlg::convertToLPCTSTR(std::string conversion)
{
size_t convertedChars = 0;
const size_t newsizew = conversion.size() + 1;
wchar_t* wcstring = new wchar_t[newsizew];
mbstowcs_s(&convertedChars, wcstring, newsizew, conversion.c_str(), _TRUNCATE);
return wcstring;
}
您可能已经注意到,我在函数中返回了一个指针作为结果,但是输出结果不应该是指针,因此我无法在函数外部通过删除该指针所指向的内容来释放内存,因为它不是赋值给一个指针变量。那么,最佳处理方法是什么?
注释:以防万一有人问到这个函数的目的,它是将一个std::string转换为LPCTSTR,后者等同于wchar_t*。
编辑:
为了更清楚地说明问题,这是调用此函数的代码块:
BOOL CAnotherAttemptDlg::OnInitDialog()
{
std::string settingsLine;
LPCTSTR defStrPath = L""; // = L"C:\\Ste\\Runtime\\TestFiles";
LPCTSTR defEndPath = L"";
// 从FileTrans.ini读取默认起始和结束路径,并将其解析到合适的变量中
std::ifstream settingsStream("FileTrans.ini");
while (getline(settingsStream, settingsLine)) {
std::string delimiter = "=";
std::string tokenOne = settingsLine.substr(0, settingsLine.find(delimiter));
std::string tokenTwo = settingsLine.substr(settingsLine.find(delimiter) + 1, '10');
if (tokenOne == "startPath") {
defStrPath = convertToLPCTSTR(tokenTwo);
}
else if (tokenOne == "endPath") {
defEndPath = convertToLPCTSTR(tokenTwo);
}
}
settingsStream.close();
CDialogEx::OnInitDialog();
// 设置窗口样式
SetWindowLong(this->m_hWnd, GWL_STYLE, GetWindowLong(this->m_hWnd, GWL_STYLE) | WS_SYSMENU);
// 设置对话框图标(框架会在应用程序主窗口不是对话框时自动完成这一操作)
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// 在此处添加额外的初始化代码
SetDlgItemText(IDC_MFCEDITBROWSE1, defStrPath);
SetDlgItemText(IDC_MFCEDITBROWSE2, defEndPath);
return TRUE; // 除非你将焦点设置到某个控件上,否则返回TRUE
delete[] defStrPath;
delete[] defEndPath;
}