delete void指针
孙鑫的深入详解上又一个错误,我已经发现书上的瑕疵不只一处了
如下:
struct PRECVPARAM
{
SOCKET sock;
HWND hwnd;
};
CChatDialog::OnInitDialog(...)
{
PRECVPARAM *p=[b]new PRECVPARAM[/b];
p-> sock=m_socket;
p-> hwnd=m_hWnd;
HANDLe hThread=CreateThread(NULL,0,RecvProc,(LPVOID)p,0,NULL)
...................
}
DWORD WINAPI RecvProc(LPVOID lpParameter)
{
SOCKET sock=((PRECVPARAM *)lpParameter)-> sock;
HWND hwnd=((PRECVPARAM *)lpParameter)-> hwnd;
[color=#FF0000][b]delete lpParameter;[/b][/color]
...................
}
delete lpParameter错了吧,
这是空指针,根本释放不了。
应该
delete (PRECVPARAM *)lpParameter;
各位认为如何呢???
[解决办法]
因为不同的指针寻址长度不同,delete时需要覆盖内存,如果长度出错可能在覆盖内存时越界;
据个例子
char *p = new char[1];
int *q=(int*)p;
delete p;
绝对错
[解决办法]
delete一个指针,和这个指针的类型无关,只要他是从new得到的就可以释放。
[解决办法]
delete void指针不行的吧,我觉得应该要知道该指针的类型的,void指针只存储了指向内存单元的首地址,但没有写明所指向的内存单元的长度啊
[解决办法]
//工程一下得到的结果:MyClass* p1 = new MyClass();p1->m_memory = new char[4];void* p2;p2 = p1;delete p2; // 报告内存泄露,大小为 4 bytep2 = new char[4];delete p2; // 没有任何问题p2 = NULL;delete p2; // 没有任何问题
[解决办法]
#include <iostream>class A{public: A() { std::cout << "A()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; }};int main(){ A* a = new A; delete a; //释放将会调用析构函数,因为知道他具有类类型 void *b = new A; delete b; //释放将不会调用析构函数 //我想这是他们的唯一区别吧,内存都可以得到释放,只是类型检查问题 system("pause"); return 0;}
[解决办法]
指针本身是能释放的。只是不能调用析构函数。也就说如果此对象里如果还有其他new的对象需要释放的话,那么那个new的对象没有被释放,就内存泄漏了。
[解决办法]