VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1191|回复: 7

如何正确的返回字符串指针?

[复制链接]
44_avatar_middle
最佳答案
0 
online_vip 发表于 2019-7-23 15:12:06 | 显示全部楼层 |阅读模式
  1. char * GetFilePath(DWORD dwProcessId)
  2. {
  3.         //DWORD dwProcessId = 3344;
  4.         HANDLE hProcess = NULL;
  5.         BOOL bSuccess = FALSE;
  6.         hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ , FALSE, dwProcessId );
  7.         char szPath[MAX_PATH + 1] = {0};
  8.         HMODULE hMod = NULL;
  9.         DWORD cbNeeded = 0;
  10.         if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
  11.         {
  12.                 GetModuleFileNameEx( hProcess, hMod, szPath, MAX_PATH );
  13.         }
  14.         return szPath;
  15. }
复制代码



arning C4172: 返回局部变量或临时变量的地址

我知道这样肯定是不行的,是不能直接返回局部变量的,但是如果我在不添加参数的情况下,要如何修改,才是正确的。
C++越学越糊涂。




上一篇:关于int,const char* 拷贝问题
下一篇:新手提问!!请问C26495警告要如何解决??
81_avatar_middle
最佳答案
3 
online_supermod 发表于 2019-7-23 16:32:36 | 显示全部楼层
char* szPath = new char[MAX_PATH + 1];
memset(szPath, 0, MAX_PATH + 1);

评分

参与人数 1驿站币 +2 热心值 +1 收起 理由
44_avatar_small hahacker + 2 + 1

查看全部评分

98_avatar_middle
最佳答案
0 
online_moderator 发表于 2019-7-27 23:25:25 | 显示全部楼层
直接return std::wstring(szPath),返回局部对象就可以了,c++ 建议不要随便用裸指针

评分

参与人数 1驿站币 +2 热心值 +1 收起 理由
44_avatar_small hahacker + 2 + 1

查看全部评分

20_avatar_middle
最佳答案
0 
online_vip 发表于 2019-8-3 16:14:14 | 显示全部楼层
char szPath[MAX_PATH + 1]   // 这是栈内存,由编译器释放,也就是离开了函数编译器就已经释放了,返回的是“野指针”;

解决方案一,返回类对象,由类对象管理内存:
  1. std::string GetFilePath(DWORD dwProcessId)
  2. {
  3.         //DWORD dwProcessId = 3344;
  4.         HANDLE hProcess = NULL;
  5.         BOOL bSuccess = FALSE;
  6.         hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ , FALSE, dwProcessId );
  7.         char szPath[MAX_PATH + 1] = {0};
  8.         HMODULE hMod = NULL;
  9.         DWORD cbNeeded = 0;
  10.         if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
  11.         {
  12.                 GetModuleFileNameEx( hProcess, hMod, szPath, MAX_PATH );
  13.         }
  14.         return std::string(szPath);
  15. }
复制代码


解决方案二,返回堆内存,由程序员释放内存:
  1. char * GetFilePath(DWORD dwProcessId)
  2. {
  3.         //DWORD dwProcessId = 3344;
  4.         HANDLE hProcess = NULL;
  5.         BOOL bSuccess = FALSE;
  6.         hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ , FALSE, dwProcessId );
  7.         //char szPath[MAX_PATH + 1] = {0};
  8.         char *szPath = new char[MAX_PATH + 1];
  9.         HMODULE hMod = NULL;
  10.         DWORD cbNeeded = 0;
  11.         if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
  12.         {
  13.                 GetModuleFileNameEx( hProcess, hMod, szPath, MAX_PATH );
  14.         }
  15.         return szPath;
  16. }

  17. /*
  18. * 使用完后必须调用delete []szPath;
  19. *
  20. * char* path = GetFilePath(xx);
  21. * delete []path;
  22. */
复制代码

评分

参与人数 1驿站币 +2 热心值 +1 收起 理由
44_avatar_small hahacker + 2 + 1 很给力!

查看全部评分

88_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-3 22:09:24 | 显示全部楼层
直接返回string对象就好了,也可以考虑智能指针,或者如果是线程安全的,可以考虑全局或者静态,当然还是参数返回最简单方便

评分

参与人数 1驿站币 +2 热心值 +1 收起 理由
44_avatar_small hahacker + 2 + 1

查看全部评分

44_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-15 10:37:37 | 显示全部楼层
68ui 发表于 2019-8-3 16:14
char szPath[MAX_PATH + 1]   // 这是栈内存,由编译器释放,也就是离开了函数编译器就已经释放了,返回的 ...

弱弱的问题下

这个到底应该写成delete []path;还是应该写成delete[] path,如果两个都可能,那么推荐哪一种?

就是说,这个[]到底应该和谁组合。
88_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-15 16:22:52 | 显示全部楼层
如果想返回指针,那你指针对象不要是函数体内定义的局部变量。因为函数结束,函数的所有局部变量都会被释放,你返回的指针完全没意义。要么直接返回字符串。要么把需要返回的字符串指针,定义在函数体外
20_avatar_middle
最佳答案
0 
online_vip 发表于 2019-8-20 16:51:18 | 显示全部楼层
hahacker 发表于 2019-8-15 10:37
弱弱的问题下

这个到底应该写成delete []path;还是应该写成delete[] path,如果两个都可能,那么推荐 ...

作用是一样的,没有区别,代码风格不一样而已。

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
44_avatar_small hahacker + 2 + 2 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-25 13:05

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表