c++重载new和delete的疑问

2024-11-18 01:57:34
推荐回答(4个)
回答1:

p_free的指向已经改变,所以使用临时的指针p,话说按照楼主的意思不是应该这样写的吗?
以下代码仅供参考:
#include
#include
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

class Link
{
public:
static void *operator new(size_t size,int value);
static void operator delete(void *p);
~Link() {}
protected:
static void free_blocks(Link * p);
private:
static Link *p_free;
Link *next;
int a;
//static char *p_block;
};

Link* Link::p_free=NULL;

void *Link::operator new(size_t size,int value)
{
Link *p;
p=(Link*)malloc(size);
p->a=value;
if( p_free == NULL )
{
p_free=p;
p_free->next=NULL;
}
else
{
Link *q=p_free;
while( q->next != NULL )
q=q->next;
q->next=p;
p->next=NULL;
}
return p;
}

void Link::operator delete( void *p )
{
free_blocks((Link*)p);
}

void Link::free_blocks(Link *p)
{
Link *q;
while( p != NULL )
{
q=p->next;
cout<a<<" ";
free(p);
p=q;
}
cout<}

int main(int argc, char *argv[]) {
Link *ink;
ink=new(0) Link();
int n;
for( int i=0; i < 10; i++ )
{
n=rand()%20;
new(n) Link();
}

delete ink;
return 0;
}

回答2:

p = p_free; //为当前创建的对象分配空间。
p_free = p_free->next;
memset(p,0,size);
回答:为什么不能直接写成
memset(p_free,0,size); 现在 p_free->next==0了
p_free = p_free->next; 现在 p_free ==0了
分配函数就要崩溃了

回答3:

找你这样释放的话。
memset(p_free,0,size);
p_free = p_free->next;
第二句会报错了,p_free都空了,怎么指向next

回答4:

一、如果上来就memset,*p_free直接变0,读不到下一个元素地址