C++ new与delet问题

qq_33553286 2018-09-09 05:49:09
LPWSTR ConvertCharToLPWSTR(const char * szString)//char 转LPWSTR  这里内存泄漏 调用一次+8k 2018/9/5 22:27 发现暂未解决
{
int dwLen = strlen(szString) + 1;
int nwLen = MultiByteToWideChar(CP_ACP, 0, szString, dwLen, NULL, 0);//算出合适的长度
LPWSTR lpszPath = new WCHAR[dwLen];
MultiByteToWideChar(CP_ACP, 0, szString, dwLen, lpszPath, nwLen);
return lpszPath;
}

上面这段代码, 为啥new了不delet, 测试发现了内存泄漏, 搞的每次都要手动释放有啥好办法不用手动释放
...全文
291 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
汗水与勇气 2018-09-10
  • 打赏
  • 举报
回复
看一下你的LPWSTR类中的析构函数里面有没有delete操作,没有的话把delete加上就可以了。
函数结束后销毁lpszPath的时候调用其析构函数,没有delete的话就只是把这个指针销毁了,但是没有释放它指向的内存,会造成内存泄漏。
三岁、就很帅 2018-09-10
  • 打赏
  • 举报
回复
void ConvertCharToLPWSTR(const char * szString, LPWSTR lpszPath )
{
int dwLen = strlen(szString) + 1;
int nwLen = MultiByteToWideChar(CP_ACP, 0, szString, dwLen, NULL, 0);//算出合适的长度
MultiByteToWideChar(CP_ACP, 0, szString, dwLen, lpszPath, nwLen);
}
AlbertS 2018-09-10
  • 打赏
  • 举报
回复
shared_ptr智能指针,你值得拥有
srhouyu 2018-09-10
  • 打赏
  • 举报
回复
这样的函数本来功能就是new字符串出来,你用完了自己删。但是函数名非常有误导性,应该叫做NewWSTRFromChar(),提醒其他人随后要有DeleteWSTR()。 正确情况下,函数不应该返回字符串。应该跟大部分Win32 API那样,从参数传入一个缓冲,像这样:

void ConvertCharToLPWSTR(const char * szString, LPWSTR pathBuffer, DWORD pathBufferSize)
{
    int dwLen = strlen(szString) + 1;
    int nwLen = MultiByteToWideChar(CP_ACP, 0, szString, dwLen, NULL, 0);//算出合适的长度
    MultiByteToWideChar(CP_ACP, -1, szString, pathBufferSize, lpszPath, nwLen);
}
starytx 2018-09-10
  • 打赏
  • 举报
回复
智能指针吧,引用计数为0后自动清除
「已注销」 2018-09-10
  • 打赏
  • 举报
回复
谢谢你们!
老夏 2018-09-10
  • 打赏
  • 举报
回复
MultiByteToWideChar 没有在转换后的内容末尾自动加 '\0',所以要
LPWSTR lpszPath = new WCHAR[dwLen + 1];
MultiByteToWideChar(CP_ACP, 0, szString, dwLen, lpszPath, nwLen);
lpszPath[dwLen] = L'\0';
棉猴 2018-09-10
  • 打赏
  • 举报
回复
在调用ConvertCharToLPWSTR()函数并且使用了该函数返回的宽字符之后,就delete()。
zhongchengli 2018-09-10
  • 打赏
  • 举报
回复
new和delete最好在一起,不要分开!
AlbertS 2018-09-10
  • 打赏
  • 举报
回复
引用 10 楼 Slzde_sub 的回复:
[quote=引用 8 楼 shihengzhen101 的回复:]
shared_ptr智能指针,你值得拥有


如果没有很好的理由,请不要共享所有权,倾向于使用std::unique_ptr 来明确所有权的传递

----来自谷歌编程规范[/quote]
jshagw 2018-09-09
  • 打赏
  • 举报
回复
写个class,将转换函数写为成员函数,使用的变量lpszPath改为成员变量,通过对象的析构函数来释放内存

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧