利用(unsigned long)(new CString)将字符串转换为unsigned long型会不会造成内存泄露?

matrix2009 2009-12-14 05:12:31
如题

我找到一段代码,是这样转的

const char* szInstallID = "TAPI\ACPI0003\1";

unsigned long tmp = (unsigned long)(new CString(szInstallID ));

结果 tmp 为3690472.

我想知道 用new CString转换会不会在堆上分配内存?如果不显示释放会不会造成内存泄露?
还有,用new CString转换是如何实现的?

另外还有没有其它的办法转换字符串?

...全文
334 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
matrix2009 2009-12-18
  • 打赏
  • 举报
回复
谢谢
matrix2009 2009-12-17
  • 打赏
  • 举报
回复
to oldn_cc_bird:

CString* tmp = (CString*)m_ctrlTree.GetItemData(hItem);
delete tmp;

我写的不对吗?为什么看着别扭?你觉得应该怎么写?
oldn123 2009-12-17
  • 打赏
  • 举报
回复
这样写是对的。
只是看着别扭,至于为什么?我还不太好说了,有两点吧。
第一感觉CString *这个形式似乎并不多见..(个人感觉).不过看你的上下文代码这样用倒也说得过去。
第二delete 指针时最好先判断下指针的有效性.
if(tmp) delete tmp; tmp = NULL;
oldn123 2009-12-15
  • 打赏
  • 举报
回复
CString* tmp = (CString*)m_ctrlTree.GetItemData(hItem);
delete tmp;
_______________
看着真别扭。。
ps:楼主的头像可以吸引我的目光..
matrix2009 2009-12-15
  • 打赏
  • 举报
回复
刚才写的代码有问题
这样释放就可以了吧
void CDeviceCtrlDlg::TraverTree(HTREEITEM hItem)
{
hItem = m_ctrlTree.GetChildItem(hItem);
if(NULL != hItem)
{
HTREEITEM hParent = m_ctrlTree.GetParentItem(hItem);
if ( hParent != hRoot )
{
CString* tmp = (CString*)m_ctrlTree.GetItemData(hItem);
delete tmp;
}
TraverTree(hItem);
}

hItem = m_ctrlTree.GetNextSiblingItem(hItem);
if(NULL != hItem)
{
TraverTree(hItem);
}
}
zhouzhipen 2009-12-15
  • 打赏
  • 举报
回复
unsigned long tmp = (unsigned long)(new CString(szInstallID ));
这样不用delete清除肯定会内存泄露
CString对象实际上也可以看作是指向数据的指针,但CString对象在析构时对内存做了清理释放,所以不是动态分配的对象不会内存泄露.
但是动态分配的CString对象,在程序运行期间,一直存在,不会调用析构函数,而且CString对象本身所占用的指针空间也得不到释放.
webipstin 2009-12-15
  • 打赏
  • 举报
回复
把CString看成是普通的对象来对待就行了。

new--delete

new [] --delete []pPointer
Ryanwen 2009-12-15
  • 打赏
  • 举报
回复
还是用delete吧 用CString的析构函数来释放空间
matrix2009 2009-12-15
  • 打赏
  • 举报
回复
源代码是在堆上分配内存,然后设置一个树形控件的值,代码如下,
m_ctrlTree.SetItemData(hItem,(unsigned long)(new CString(szID)));

我该如何释放内存?

我想写一个遍历树的函数,然后释放分配的内存

void CDeviceCtrlDlg::TraverTree(HTREEITEM hItem)
{
hItem = m_ctrlTree.GetChildItem(hItem);
if(NULL != hItem)
{
TraverTree(hItem);
}
else
{
HeapFree(GetProcessHeap(), 0, (LPVOID)m_ctrlTree.GetItemData(hItem));
}

hItem = m_ctrlTree.GetNextSiblingItem(hItem);
if(NULL != hItem)
{
TraverTree(hItem);
}
}

这样可以吗?

还是必须用delete?
  • 打赏
  • 举报
回复
new 和delete 是配对使用的
哈利路亚1874 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xhk456 的回复:]
引用 2 楼 skywoodsky 的回复:
new CString会在堆上分配内存
不用delete释放会造成内存泄露
CString str(szInstallID);直接通过构建函数就可以转换了


CDialog *pDlg = new CDialog();呢?用不用 delete pDlg;
[/Quote]
当然要,在最后退出的时候清理
linan161051 2009-12-14
  • 打赏
  • 举报
回复
new CString会在堆上分配内存
不用delete释放会造成内存泄露
CString str(szInstallID);直接通过构建函数就可以转换
似水流年__ 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 skywoodsky 的回复:]
new CString会在堆上分配内存
不用delete释放会造成内存泄露
CString str(szInstallID);直接通过构建函数就可以转换了
[/Quote]

CDialog *pDlg = new CDialog();呢?用不用 delete pDlg;
skywoodsky 2009-12-14
  • 打赏
  • 举报
回复
new CString会在堆上分配内存
不用delete释放会造成内存泄露
CString str(szInstallID);直接通过构建函数就可以转换了
The_facE 2009-12-14
  • 打赏
  • 举报
回复

unsigned long tmp = (unsigned long)(new CString(szInstallID));
// 这一行相当于:
unsigned long tmp = (unsigned long)0; // 声明一个unsigned long型数据tmp
CString * pointer = new CString(szInstallID); // 在堆上构造一个CString对象,并把其地址保存在pointer指针中
tmp = (unsigned long)pointer; // 将指针pointer的地址值转换为unsigned long类型,并赋值给tmp

16,473

社区成员

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

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

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