vc中全局指针,在子函数中用new分配的空间,没有调用delete,退出子函数之后就被销毁了 什么原因啊 各位高 20
就是一个定义的全局指针,但是是在函数A中用new分配的内存,我想在函数B中继续引用这片内存,在函数A中我并没有调用delete还销毁这个指针,可是退出函数A后,该指针的内...
就是一个定义的全局指针,但是是在函数A中用new分配的内存,我想在函数B中继续引用这片内存,在函数A中我并没有调用delete还销毁这个指针,可是退出函数A后,该指针的内存就销毁了,求高手指点
定义的是CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap;
在函数A中
pItemMap=new CMap<CString, LPCTSTR, CString, LPCTSTR>(iRowNum); //iRowNum是开辟空间的大小
pItemMap- >SetAt(strKey, strValue);
在函数B中再访问pItemMap出现内存访问错误,内存值为0X00000000,
不过将定义改为 CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap=new CMap<CString, LPCTSTR, CString, LPCTSTR>(); 后解决了,还是有些不解原因
谢谢热心的 志远823
--------------------------------------------------------------------------
按照你的例子还是不行,不过还是谢谢你 展开
定义的是CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap;
在函数A中
pItemMap=new CMap<CString, LPCTSTR, CString, LPCTSTR>(iRowNum); //iRowNum是开辟空间的大小
pItemMap- >SetAt(strKey, strValue);
在函数B中再访问pItemMap出现内存访问错误,内存值为0X00000000,
不过将定义改为 CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap=new CMap<CString, LPCTSTR, CString, LPCTSTR>(); 后解决了,还是有些不解原因
谢谢热心的 志远823
--------------------------------------------------------------------------
按照你的例子还是不行,不过还是谢谢你 展开
5个回答
展开全部
使用 new 分配的内存是不会被自动销毁,直到程序进程退出或者你调用delete 删除该指针分配的内存.
全局指针被销毁的原因有可能:
1. 你的指针是一个引用计数智能指针,比如boost::shared_ptr, 没人用引用就自动销毁了.
2. 指针没有被销毁,也许你的程序在那里把全局指针重新赋值或者设为NULL了.(这个貌似概率大一些). 实际上这种情况下,原来指针分配的内存已经失去控制(泄漏了),可要仔细调调哦
----------------------------------------------
楼主能否详细说说你怎么发现内存销毁的,最好把代码贴出来我看看
----------------------------------------------
从你的出错来看是访问空指针了.你的全局指针如果没有初始化则是一个野指针通常不为空,如果初始化后又变成空,那肯定是什么地方给删除掉或者直接给空了.这个你好好的检查一下.
此外你的全局指针从代码来看有点问题,我给你个例子吧
在stdafx.cpp里定义
CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap;
在stdafx.h里定义
extern CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap; // 全局指针
funA()
{
// 注意,如果pItemMap已经被初始化过了,需要先释放再重新初始化,否则内存泄漏
pItemMap=new CMap<CString, LPCTSTR, CString, LPCTSTR>();
}
funB()
{
pItemMap- >SetAt(strKey, strValue);
}
你比对你的代码再看看吧
----------------------------------------------
恩,那的确比较奇怪了,我现在有点怀疑崩溃是不是由于你映射内的字符串指针引起的?
你可以把完整的工程发给我,我看看calmman.yang@163.com
全局指针被销毁的原因有可能:
1. 你的指针是一个引用计数智能指针,比如boost::shared_ptr, 没人用引用就自动销毁了.
2. 指针没有被销毁,也许你的程序在那里把全局指针重新赋值或者设为NULL了.(这个貌似概率大一些). 实际上这种情况下,原来指针分配的内存已经失去控制(泄漏了),可要仔细调调哦
----------------------------------------------
楼主能否详细说说你怎么发现内存销毁的,最好把代码贴出来我看看
----------------------------------------------
从你的出错来看是访问空指针了.你的全局指针如果没有初始化则是一个野指针通常不为空,如果初始化后又变成空,那肯定是什么地方给删除掉或者直接给空了.这个你好好的检查一下.
此外你的全局指针从代码来看有点问题,我给你个例子吧
在stdafx.cpp里定义
CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap;
在stdafx.h里定义
extern CMap<CString, LPCTSTR, CString, LPCTSTR>*pItemMap; // 全局指针
funA()
{
// 注意,如果pItemMap已经被初始化过了,需要先释放再重新初始化,否则内存泄漏
pItemMap=new CMap<CString, LPCTSTR, CString, LPCTSTR>();
}
funB()
{
pItemMap- >SetAt(strKey, strValue);
}
你比对你的代码再看看吧
----------------------------------------------
恩,那的确比较奇怪了,我现在有点怀疑崩溃是不是由于你映射内的字符串指针引起的?
你可以把完整的工程发给我,我看看calmman.yang@163.com
展开全部
指针销毁了,其之前指向的内存还在
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
new CMap<CString, LPCTSTR, CString, LPCTSTR>(iRowNum)
改为new CMap<CString, LPCTSTR, CString, LPCTSTR>[iRowNum]
注:[iRowNum]使用方括号,而不是圆括号
改为new CMap<CString, LPCTSTR, CString, LPCTSTR>[iRowNum]
注:[iRowNum]使用方括号,而不是圆括号
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
释放函数)的目的就是为了使其能够自动调用释放的类的析构函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
子函数?被调用的啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询