delete[](void *p, size_t size) 的size 与 new[](size_t size) 的size 不一样, 怎么处理

时间:2021-10-24 09:30:23
class object
{
int s;

public:

object() 
{
//cout << "create object : "<< s<< endl;
};

virtual ~object() 
{
//cout << "destroy object : "<< s << endl;
};

void * operator new (size_t size)
{
cout << "void * operator new (size_t size); size :" << size << endl;
return malloc(size);
};
void * operator new[] (size_t size)
{
cout << "void * operator new[] (size_t size); size :" << size << endl;
return malloc(size);
};

/*void * operator new[] (size_t size, object *op)
{
cout << "void * operator new[] (size_t size, cxObject *op); size :" << size << endl;
return malloc(size);
};    */

/*void operator delete(void * p)
{
cout << "void operator delete(void * p); size :" << size << endl;
}; */
void operator delete(void * p, size_t size)
{
cout << "void operator delete(void * p, size_t size); size :" << size << endl;
free(p);
};
void operator delete[](void *p, size_t size)
{
cout << "void operator delete[](void *p, size_t size); size :" << size << endl;
free(p);
};
/* void operator delete[](void *p, object *op)
{
cout << "void operator delete[](void *p, cxObject *op); size :" << endl;
free(p);
};    */

};


int main(int argc, char *argv[])
{
object * p = new object[10];//大小84
delete[] p;//这里8
return 0;
}

在vc6, vc7下编译都不一样;
g++倒是一样, bcbX有一点差异
这样自己定义内存管理;就无法把握释放的大小;
请问如何得到正确的释放内存大小

16 个解决方案

#1


请问VC6,7,BCB的结果分别是什么?

我只有DEV,不好试.:P

#2


no matching operator delete found;

#3


---------- vc6, vc7----------
void * operator new[] (size_t size); size :84
void operator delete[](void *p, size_t size); size :8

---------- BCB ----------
void * operator new[] (size_t size); size :84
void operator delete[](void *p, size_t size); size :80

---------- G++(DEV) ----------
void * operator new[] (size_t size); size :84
void operator delete[](void *p, size_t size); size :84


这样子怎么编通用的内存池, 我搞不懂;

#4


55555555555, 还是没人帮忙

#5


delete[] p;//这里8

这里的理解有问题。

一般,一次new对应一次delete
因此,new的大小因该被记录下来,
在delete的时候,
不管是delete还是delete[],
都按上次new的大小释放空间。

#6


??

#7


如果每一次都自己记录,要消耗大量的空间时间;
我觉得这里编译器应该帮我们做到;
比如G++就做到了, 可是VC6,7没有, 偏偏又是最常用的;

delete[] p;//这里8
这里会到用调用自定义的
void operator delete[](void *p, size_t size)
可惜size是不正确的;

#8


没人有好的方案, 哎, 明天解贴

#9


???怎么几百个错误,什么程序啊.........

#10


size_t是什么东西

#11


你用C++为什么不用new和delete呢?

还有你用G++可以正确的做不是你的程序的原因,g++中你可以
char * p = new char[1024];
而只需要delete p就全释放掉了

#12


怎么几百个错误,什么程序啊.........?
噢, 我在5个编译器下通过;
别告诉我里没包含头文件, 呵呵;

你用C++为什么不用new和delete呢?

我的目的你不明白, 我实现学作内存池;
避免内存的不停的分配释放的消耗;
这里只是想验证new 和delete的size参数是或一致;
如果一致, 我就不需要编hash保存每个指针对应的内存大小;
内存池的代码就会简化

我的意思没表达清楚, 对不起;
见我的http://blog.csdn.net/wujian53/archive/2004/12/06/206506.aspx
这里有我内存池的简单实现, 目的是学习;
我只是实现当个对象的分配, 对于数组的分配, 由于size的缘故没实现;

#13


o, 9号散分

#14


new分配的内存地址前面4个字节是存放大小的(debug版本)

#15


9号劫分

#16


new分配的内存地址前面4个字节是存放大小的(debug版本)

这可不行, 不具备移植性;
不过谢谢了;
解贴

#1


请问VC6,7,BCB的结果分别是什么?

我只有DEV,不好试.:P

#2


no matching operator delete found;

#3


---------- vc6, vc7----------
void * operator new[] (size_t size); size :84
void operator delete[](void *p, size_t size); size :8

---------- BCB ----------
void * operator new[] (size_t size); size :84
void operator delete[](void *p, size_t size); size :80

---------- G++(DEV) ----------
void * operator new[] (size_t size); size :84
void operator delete[](void *p, size_t size); size :84


这样子怎么编通用的内存池, 我搞不懂;

#4


55555555555, 还是没人帮忙

#5


delete[] p;//这里8

这里的理解有问题。

一般,一次new对应一次delete
因此,new的大小因该被记录下来,
在delete的时候,
不管是delete还是delete[],
都按上次new的大小释放空间。

#6


??

#7


如果每一次都自己记录,要消耗大量的空间时间;
我觉得这里编译器应该帮我们做到;
比如G++就做到了, 可是VC6,7没有, 偏偏又是最常用的;

delete[] p;//这里8
这里会到用调用自定义的
void operator delete[](void *p, size_t size)
可惜size是不正确的;

#8


没人有好的方案, 哎, 明天解贴

#9


???怎么几百个错误,什么程序啊.........

#10


size_t是什么东西

#11


你用C++为什么不用new和delete呢?

还有你用G++可以正确的做不是你的程序的原因,g++中你可以
char * p = new char[1024];
而只需要delete p就全释放掉了

#12


怎么几百个错误,什么程序啊.........?
噢, 我在5个编译器下通过;
别告诉我里没包含头文件, 呵呵;

你用C++为什么不用new和delete呢?

我的目的你不明白, 我实现学作内存池;
避免内存的不停的分配释放的消耗;
这里只是想验证new 和delete的size参数是或一致;
如果一致, 我就不需要编hash保存每个指针对应的内存大小;
内存池的代码就会简化

我的意思没表达清楚, 对不起;
见我的http://blog.csdn.net/wujian53/archive/2004/12/06/206506.aspx
这里有我内存池的简单实现, 目的是学习;
我只是实现当个对象的分配, 对于数组的分配, 由于size的缘故没实现;

#13


o, 9号散分

#14


new分配的内存地址前面4个字节是存放大小的(debug版本)

#15


9号劫分

#16


new分配的内存地址前面4个字节是存放大小的(debug版本)

这可不行, 不具备移植性;
不过谢谢了;
解贴