关于LPWSTR的问题

呀呀的呀 2010-05-16 04:44:24
本人通过下面函数得到程序启动的传入参数:
其中 CStringArray m_strCmdArray;
BOOL CMyDlg::GetCmdLine()
{
LPWSTR* argv = NULL;
argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);

//得到传入字串
for (int i=1; i<argc; i++)
{
CString msg = "";
msg = argv[i];
m_strCmdArray.Add(msg); //保存 字串
}

return TRUE;
}

问题是关闭程序后:
argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
执行到这边会内存泄露
为啥会这样呢?
LPWSTR* argv 这个指针没有new呀?

希望哪位大哥可以告诉我下
...全文
119 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
呀呀的呀 2010-12-03
  • 打赏
  • 举报
回复
感谢大家
nineforever 2010-05-17
  • 打赏
  • 举报
回复
需要手工释放的,参见MSDN上的例子(http://msdn.microsoft.com/en-us/library/bb776391.aspx)

#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int __cdecl main()
{
LPWSTR *szArglist;
int nArgs;
int i;

szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
if( NULL == szArglist )
{
wprintf(L"CommandLineToArgvW failed\n");
return 0;
}
else for( i=0; i<nArgs; i++) printf("%d: %ws\n", i, szArglist[i]);

// Free memory allocated for CommandLineToArgvW arguments.

LocalFree(szArglist);

return(1);
}
jackyjkchen 2010-05-16
  • 打赏
  • 举报
回复
还有啊,对于CommandLineToArgvW这样只有U版的函数,CString最好也显式指定CStringW
jackyjkchen 2010-05-16
  • 打赏
  • 举报
回复
CommandLineToArgvW会自己分配存储空间,所以要释放,LocalFree好像,不过用HeapFree或free都不会报错(据说LocalFree在32位机器上和HeapFree行为统一了)。

不释放也没关系,主函数结束就系统回收了

64,642

社区成员

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

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