我正在尝试将一些代码移植到Ubuntu Server上的新G ++。我不确定这段代码是做什么的,但是快速浏览一下,它试图删除与指针相关的内存。
class mem_block
{
public:
class mem_block* next;
void* pntr;
int size;
mem_block( int i ) {
record_new( sizeof( mem_block ), MEM_MEMORY );
size = i;
pntr = new char[size];
return;
}
~mem_block( ) {
record_delete( sizeof( mem_block ), MEM_MEMORY );
delete *pntr; // Troubled line.
return;
}
};
现在我尝试删除[] pntr; (就像它最初的那样),它是当前的形式等等......我讨厌将代码注释掉,因为这会造成大量的内存泄漏。我很有信心。
有什么想法吗?它让我无法删除void *,在这种情况下,void *不是指向对象的类型
答案 0 :(得分:3)
您需要删除指针本身而不是其引用值,它应该是:
delete [] (char*)pntr;
答案 1 :(得分:2)
来自C ++标准[第5.3.5(3)节]: "在第二种方法(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义。"
在您的情况下,pntr的动态类型是char *,因此使用C ++强制转换显式地通知编译器其类型。
delete [] (static_cast<char*>(pntr));