delete void指针解决方法
delete void指针孙鑫的深入详解上又一个错误,我已经发现书上的瑕疵不只一处了如下:structPRECVPARAM{SOCKE
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得到的就可以释放。
[解决办法]
[解决办法][解决办法][解决办法][解决办法][解决办法][解决办法][解决办法]C/C++ codedelete void指针不行的吧,我觉得应该要知道该指针的类型的,void指针只存储了指向内存单元的首地址,但没有写明所指向的内存单元的长度啊
[解决办法]
[解决办法]
void *一般称做范指针吧?! 指向一个用户类的对象没有任何问题呀。从 void *不能判定一定指向内置类型呀。
LZ 这个问题可以这样考虑。
delete 分2个子步骤。
1. 调用析构器
2. 释放本对象占有的堆上内存
由于采用了void *,导致编译器没有足够的信息合成调用析构器的代码。因此,析构器无法被调用了。可以确定的是本对象是被释放了。然而,需要在析构函数中做的事情都没有发生。
对于内置类型,无所谓,因为它们有一个可以忽略的析构器。
对于用户类型,要看是否有一个有意义的析构器。假设有,比如需要进一步释放在构造器内分配的内存,由于没有调用析构器,则发生内存泄露。再假设,需要在析构器中关闭数据库连接,那抱歉,数据库保持连接。
对于delete [] 可以有类似的分析。
LZ 进行类型转换的想法,是对的。
[解决办法]
[解决办法]
C/C++ code//工程一下得到的结果: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; // 没有任何问题
[解决办法]
C/C++ code#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的对象没有被释放,就内存泄漏了。
[解决办法]