初学者问一个关于内存泄露的有关问题
菜鸟问一个关于内存泄露的问题
本人刚接触VC++6.0不久,十足的菜鸟,编了程序运行后发现该进程中内存使用始终再往上涨,涨的也不算快,初步发现是里面SOCKET tcp通讯造成的,只要不通讯就不怎么涨了,请问各位高手,这种情况是不是不正常,如何避免,谢谢大家不吝赐教!
------解决方案--------------------
new和delete运算符用于动态分配和撤销内存的运算符
new用法:
1. 开辟单变量地址空间
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
2. 开辟数组空间
一维: int *a = new int[100];开辟一个大小为100的整型数组空间
二维: int **a = new int[5][6]
三维及其以上:依此类推.
一般用法: new 类型 [初值]
delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
------解决方案--------------------
1.你很多地方GetDC 你用完以后ReleaseDC啊!
2.初略看了下你的代码 “CBrush *bbb=new CBrush(RGB(192,192,192));”new的内存,没看到你用完后delete。你怕忘记delete,何不
“CBrush *bbb=new CBrush(RGB(192,192,192)); //CBrush bbb(RGB(192,192,192));
dc.SelectObject(bbb); //dc.SelectObject(&bbb);”
------解决方案--------------------
教程上确实说CClientDC的析构函数可以ReleaseDC。
但你根据C++的知识来看,pDC1只是个指针,不是栈上创建的对象。一个指针超出作用域的时候能自动调用析构函数吗?
另外,问题很可能是19楼说的地方。
还有就是,能不new就尽量不要new,能在栈上创建对象就在栈上创建。
如果一个函数内代码太复杂,new了以后怕忘了delete的话,最好使用C++ RAII技术,即用智能指针代替普通指针管理内存。
------解决方案--------------------
而且m_picture.GetDC(); 返回的本来就是CDC指针,不是CClientDC指针。
CClientDC一般是这样用的
CClientDC dc(this);
这样的dc才是栈上对象,离开作用域时能自动调用析构函数。
你是取m_picture的设备上下文的话,应该
CClientDC dc(&m_picture);
本人刚接触VC++6.0不久,十足的菜鸟,编了程序运行后发现该进程中内存使用始终再往上涨,涨的也不算快,初步发现是里面SOCKET tcp通讯造成的,只要不通讯就不怎么涨了,请问各位高手,这种情况是不是不正常,如何避免,谢谢大家不吝赐教!
------解决方案--------------------
new和delete运算符用于动态分配和撤销内存的运算符
new用法:
1. 开辟单变量地址空间
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
2. 开辟数组空间
一维: int *a = new int[100];开辟一个大小为100的整型数组空间
二维: int **a = new int[5][6]
三维及其以上:依此类推.
一般用法: new 类型 [初值]
delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
------解决方案--------------------
1.你很多地方GetDC 你用完以后ReleaseDC啊!
2.初略看了下你的代码 “CBrush *bbb=new CBrush(RGB(192,192,192));”new的内存,没看到你用完后delete。你怕忘记delete,何不
“CBrush *bbb=new CBrush(RGB(192,192,192)); //CBrush bbb(RGB(192,192,192));
dc.SelectObject(bbb); //dc.SelectObject(&bbb);”
------解决方案--------------------
教程上确实说CClientDC的析构函数可以ReleaseDC。
但你根据C++的知识来看,pDC1只是个指针,不是栈上创建的对象。一个指针超出作用域的时候能自动调用析构函数吗?
另外,问题很可能是19楼说的地方。
还有就是,能不new就尽量不要new,能在栈上创建对象就在栈上创建。
如果一个函数内代码太复杂,new了以后怕忘了delete的话,最好使用C++ RAII技术,即用智能指针代替普通指针管理内存。
------解决方案--------------------
而且m_picture.GetDC(); 返回的本来就是CDC指针,不是CClientDC指针。
CClientDC一般是这样用的
CClientDC dc(this);
这样的dc才是栈上对象,离开作用域时能自动调用析构函数。
你是取m_picture的设备上下文的话,应该
CClientDC dc(&m_picture);