关于学习智能指针的问题

junccc 2018-11-12 03:05:43
我想把这个方法中的返回指针(szResult)内存自动释放。这样做行吗?如果不是这样做,应该怎么做?谢谢,,,学习中,。
char* ReadString(char* szSection, char* szKey, const char* szDefaultValue)
{
char* szResult = new char[MAXSTRINGLEN];
std::shared_ptr<char> pResult(szResult);//加入智能指针
memset(szResult, 0x00, MAXSTRINGLEN);
GetPrivateProfileString((LPCTSTR)szSection, (LPCTSTR)szKey,
(LPCTSTR)szDefaultValue, szResult, MAXSTRINGLEN, (LPCTSTR)m_szFileName);
return szResult;
}
...全文
51 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-11-15
  • 打赏
  • 举报
回复
智能指针空间也有限。
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
赵4老师 2018-11-14
  • 打赏
  • 举报
回复
智能指针明显比不上静态数组。
tiger波波 2018-11-14
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
智能指针明显比不上静态数组。
静态数组空间有限吧
smwhotjay 2018-11-13
  • 打赏
  • 举报
回复

可以
赵4老师 2018-11-13
  • 打赏
  • 举报
回复
多线程版:
TCHAR* ReadString(TCHAR* szSection, TCHAR* szKey, const TCHAR* szDefaultValue)
{
static TCHAR szResult[MAX_THREAD_NUM][MAXSTRINGLEN];
int tid;
tid=GetCurrentThreadId()%MAX_THREAD_NUM;
memset(szResult[tid], 0x00, MAXSTRINGLEN*sizeof(TCHAR));
GetPrivateProfileString((LPCTSTR)szSection, (LPCTSTR)szKey,(LPCTSTR)szDefaultValue, szResult[tid], MAXSTRINGLEN, (LPCTSTR)m_szFileName);
return szResult[tid];
}
worldy 2018-11-13
  • 打赏
  • 举报
回复
不是返回szResult,而是应该pResult,然后赋值给一个智能指针。函数原型要做相应更改
hgreminem 2018-11-12
  • 打赏
  • 举报
回复
引用 7 楼 junccc 的回复:
问一下。赵4老师,看查了一下。静态数组不是函数结束后就自动释放吗?这样,返回值没有问题?


静态变量生命周期是整个程序的生命周期,所以函数调用完后不会被释放。但是存在多线程读写时会出错的问题。
zgl7903 2018-11-12
  • 打赏
  • 举报
回复
智能指针也不能超过作用域使用, 建议以参数方式传入, 谁申请谁销毁

LPCTSTR ReadString(LPCTSTR szSection, LPCTSTR szKey, LPCTSTR szDefaultValue, LPTSTR szResult, int iBuffSize)
{
GetPrivateProfileString(szSection, szKey, szDefaultValue, szResult, iBuffSize, m_szFileName);
return szResult;
}




smwhotjay 2018-11-12
  • 打赏
  • 举报
回复
静态char[] 生命周期长啊。。
这样使用,单线程没问题,多线程。。。就出问题了。
junccc 2018-11-12
  • 打赏
  • 举报
回复
问一下。赵4老师,看查了一下。静态数组不是函数结束后就自动释放吗?这样,返回值没有问题?
junccc 2018-11-12
  • 打赏
  • 举报
回复
谢谢,各位朋友位
junccc 2018-11-12
  • 打赏
  • 举报
回复
我看错了。你用的是静态数组,谢谢赵4老师
tiger波波 2018-11-12
  • 打赏
  • 举报
回复
肯定不行吧,szResult是你的返回值,返回以后你把指针释放了,那返回值还有啥用? 我觉着你应该把智能指针放在调用这个函数的代码段里
junccc 2018-11-12
  • 打赏
  • 举报
回复
静态的就自动释放了?
ForgetTomorrow 2018-11-12
  • 打赏
  • 举报
回复
return不也是空了吗?那你这函数还有啥意义
赵4老师 2018-11-12
  • 打赏
  • 举报
回复
TCHAR* ReadString(TCHAR* szSection, TCHAR* szKey, const TCHAR* szDefaultValue)
{
static TCHAR szResult[MAXSTRINGLEN];
memset(szResult, 0x00, MAXSTRINGLEN*sizeof(TCHAR));
GetPrivateProfileString((LPCTSTR)szSection, (LPCTSTR)szKey,(LPCTSTR)szDefaultValue, szResult, MAXSTRINGLEN, (LPCTSTR)m_szFileName);
return szResult;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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