内存泄露的问题

navyl 2010-01-22 09:40:07
我在做一个控件,但我对用ATL开发ActiveX不熟悉。
我想知道如果在ActiveX中有一个属性,BSTR类型的,假设有一个“学号”的属性,对应的变量
BSTR m_no
我这样用:
m_no = _com_util::ConvertStringToBSTR("00000001");

我需要显式释放m_no吗

如果是VARIANT m_no,我需要显式释放m_no吗
...全文
129 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
marrco2005 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 navyl 的回复:]
引用 13 楼 wizardk 的回复:

都需要你自己调用SysFreeString去释放,否则你调用ConvertStringToBSTR而连带造成触发SysAllocString,从栈中开辟出的空间,谁给你释放?


我也是这样想,但是如果是第二种情况,即
VARIANT m_no;
这样的要怎样释放
[/Quote]
VARIANT 用 VariantClear( ) 函数清楚
VariantClear 会根据 VARIANT 的类型自动调用相应的资源释放函数

下面是MSDN的说明

If the vt member is VT_BSTR, the string is freed.

If the vt member is VT_DISPATCH, the object is released.

If the vt member has the VT_ARRAY bit set, the array is freed.


navyl 2010-01-22
  • 打赏
  • 举报
回复
是不是这个问题太幼稚园了,大侠们都不屑回答。
navyl 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wizardk 的回复:]

都需要你自己调用SysFreeString去释放,否则你调用ConvertStringToBSTR而连带造成触发SysAllocString,从栈中开辟出的空间,谁给你释放?
[/Quote]

我也是这样想,但是如果是第二种情况,即
VARIANT m_no;
这样的要怎样释放
WizardK 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 navyl 的回复:]
引用 9 楼 wizardk 的回复:
如果放入了COleVariant就不需要释放,因为其析构会帮你处理。
如果仅仅是ConvertStringToBSTR了,就需要自己最后去SysFreeString。

不好意思,可能是我没有说清楚,我的意思是
1、BSTR m_no
2、VARIANT m_no
[/Quote]

都需要你自己调用SysFreeString去释放,否则你调用ConvertStringToBSTR而连带造成触发SysAllocString,从栈中开辟出的空间,谁给你释放?
navyl 2010-01-22
  • 打赏
  • 举报
回复
1、BSTR m_no
m_no = _com_util::ConvertStringToBSTR("00000001");

2、VARIANT m_no
m_no.vt = VT_BSTR;
m_no.bstrVal = _com_util::ConvertStringToBSTR("00000001");
navyl 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wizardk 的回复:]
如果放入了COleVariant就不需要释放,因为其析构会帮你处理。
如果仅仅是ConvertStringToBSTR了,就需要自己最后去SysFreeString。
[/Quote]
不好意思,可能是我没有说清楚,我的意思是
1、BSTR m_no
2、VARIANT m_no
tiancai76 2010-01-22
  • 打赏
  • 举报
回复
不需要啊,用boundersCheck检测一下就知道有没有内存泄露了~~
[Quote=引用楼主 navyl 的回复:]
我在做一个控件,但我对用ATL开发ActiveX不熟悉。
我想知道如果在ActiveX中有一个属性,BSTR类型的,假设有一个“学号”的属性,对应的变量
BSTR m_no
我这样用:
m_no = _com_util::ConvertStringToBSTR("00000001");

我需要显式释放m_no吗

如果是VARIANT m_no,我需要显式释放m_no吗
[/Quote]
WizardK 2010-01-22
  • 打赏
  • 举报
回复
如果放入了COleVariant就不需要释放,因为其析构会帮你处理。
如果仅仅是ConvertStringToBSTR了,就需要自己最后去SysFreeString。
joimson 2010-01-22
  • 打赏
  • 举报
回复
它是一个指针
最好释放一下
navyl 2010-01-22
  • 打赏
  • 举报
回复
我跟踪了一下,执行了::SysFreeString(m_no);这条语句。
~Student
{
if(m_no)
::SysFreeString(m_no);
}
快乐鹦鹉 2010-01-22
  • 打赏
  • 举报
回复
是new产生的么?一般不需要吧。
北京的雾霾天 2010-01-22
  • 打赏
  • 举报
回复
一般需要使用SysFreeString来释放,但这样看情况。
bragi523 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 miaolingshaohua 的回复:]
不用
[/Quote]up
navyl 2010-01-22
  • 打赏
  • 举报
回复
不会内存泄露吗?
这两种类型又不是自管理的。
ccpaishi 2010-01-22
  • 打赏
  • 举报
回复
不需要的
哈利路亚1874 2010-01-22
  • 打赏
  • 举报
回复
不用
WizardK 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 navyl 的回复:]
引用 13 楼 wizardk 的回复:

都需要你自己调用SysFreeString去释放,否则你调用ConvertStringToBSTR而连带造成触发SysAllocString,从栈中开辟出的空间,谁给你释放?


我也是这样想,但是如果是第二种情况,即
VARIANT m_no;
这样的要怎样释放
[/Quote]

这要看你的应用情况,你都知道VARIANT里面放的是BSTR了,那么就直接释放m_no.bstrVal,或者调用楼上所说的VariantClear()去释放。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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