如何释放CStringArray里面的对象? CStringArray中存储的是CString的对象,不过,我没有存储CString的指针,这就造成使用CStringArray的RemoveAll()函数时并不能真正释放掉CString对象的内容,使得它始终占有内存直到程序退出。请问,我如何在调用RemoveAll()的同时清理CSTringArray数组中所有的对象的内存?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 逐个CString取出,然后Empty总可以了吧。 按MSDN的说法,应该已经删除了When a CString array is deleted, or when its elements are removed, string memory is freed as appropriate. CArray是一个自动模板类,如果是CString类型的,CString内部会自动处理.当你构造了一个CString的实例以后,他的生存期随着你的构建的环境而自动释放. : gufengduyu赞同你的说法! "When a CString array is deleted"是指把CStringArray对象删除?而不是调用它的RemoveAll()来是否内存? msdn上有个例子:// example for CObArray::RemoveAllCObArray array;CAge* pa1;CAge* pa2;array.Add( pa1 = new CAge( 21 ) ); // Element 0array.Add( pa2 = new CAge( 40 ) ); // Element 1ASSERT( array.GetSize() == 2 );array.RemoveAll(); // Pointers removed but objects not deleted.ASSERT( array.GetSize() == 0 );delete pa1;delete pa2; // Cleans up memory. to: yangyong1980919(山那边的小子) msdn中的例子正是使用了指针,而我,没有使用指针! 当CStringArray生存期结束时,应该能自动删除。 我测了一下,认为RemoveAll()函数在释放内存方面没有什么问题,但是内存狂长的问题出现在为CStringArray对象分配空间的时候!!微软的破玩意!测试过程是这样的,建立一个基于dialog的对话框,其中一个按钮用来为CStringArray申请内存,如下:void CTestarrayDlg::OnButton1() { // TODO: Add your control notification handler code here CString sStr = "Use this to eat memories!"; int nSize = 0; //nSize = m_arrTest.GetSize(); for(int n=nSize; n<nSize+1000000; n++) { m_arrTest.InsertAt(n, sStr); }}另一个按钮用来释放内存:void CTestarrayDlg::OnButton2() { // TODO: Add your control notification handler code here m_arrTest.RemoveAll(); m_arrTest.SetSize(0, 1000);}测试发现,多次配合点击button1和button2,发现内存是持续增长的,而每次button2释放的内存数量则基本是固定的一个数目,这个数目是与字符串实际消耗的大小一致的。怎么办呢?CStringArray到底还能不能用? CStringArray用于字符串数组,内部已经有释放代码。由于CString总是分配和释放空间,可能造成内存碎片。解决的方法是用托管代码。 CStringArrat原来有这么多的问题,用起来还真的小心呀,可这个类确实很好用啊 ,到底有没有好的解决方法啊???gzgzgzgzgzgzgzgzgzgzgzgzgzgzgzggzgzgzxx~!~!~! 我在使用中也发现这种问题,对于大数据量长时间运行的程序,还是不要使用CStringArray了,改用Vector比较好。 如何获取指定DC的RGB数据?? 为什么shell执行时没有找到 mfc遍历控件的问题 CSpinButtonCtrl设置负值的疑惑 MFC视窗内可以实现动画效果吗? 我用下面方法获取网页所有链接总数,为总何总是零呢?? Socket通信中的多线程问题 我要创建一个类CMsg,基类是CObject,可是在ClassWizard中的BaseClass选项中找不到CObject,所以建不成CMsg,为什么,怎么办?? 1.怎么在按纽上显示比较美观的字啊.2.怎么让对话框一开始就撑满整个屏幕啊? iso格式如何刻成光盘???? 郁闷!程序为什么不能设置断点? 如何在WORD上添加按钮代来的问题
当你构造了一个CString的实例以后,他的生存期随着你的构建的环境而自动释放.
// example for CObArray::RemoveAllCObArray array;
CAge* pa1;
CAge* pa2;array.Add( pa1 = new CAge( 21 ) ); // Element 0
array.Add( pa2 = new CAge( 40 ) ); // Element 1
ASSERT( array.GetSize() == 2 );
array.RemoveAll(); // Pointers removed but objects not deleted.
ASSERT( array.GetSize() == 0 );
delete pa1;
delete pa2; // Cleans up memory.
msdn中的例子正是使用了指针,而我,没有使用指针!
void CTestarrayDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString sStr = "Use this to eat memories!";
int nSize = 0;
//nSize = m_arrTest.GetSize();
for(int n=nSize; n<nSize+1000000; n++)
{
m_arrTest.InsertAt(n, sStr);
}
}另一个按钮用来释放内存:
void CTestarrayDlg::OnButton2()
{
// TODO: Add your control notification handler code here
m_arrTest.RemoveAll();
m_arrTest.SetSize(0, 1000);
}测试发现,多次配合点击button1和button2,发现内存是持续增长的,而每次button2释放的内存数量则基本是固定的一个数目,这个数目是与字符串实际消耗的大小一致的。怎么办呢?CStringArray到底还能不能用?
由于CString总是分配和释放空间,可能造成内存碎片。解决的方法是用托管代码。
gzgzgzgzgzgzgzgzgzgzgzgzgzgzgzggzgzgz
xx~!~!~!