重载运算符new而不使用关键字new和malloc? 我试图更好地理解C++中的内存分配。关于WEBs有很多概念和理论,但是我找不到C++全局运算符新的真正的源代码。 我理解只需重载运算符new和delete即可: void* operator new(size_t size){ void* allocated = malloc(size); //allocate necessary space; return allocated; } void operator delete(void* ptr){ SA<T>* p = static_cast< SA<T>* >(ptr); return free(p); } void*运算符新建(大小){ void*allocated=malloc(size);//分配必要的空间; 分配的回报; } void操作符删除(void*ptr){ SA*p=静态铸件(ptr); 免费返回(p); }
但是当我看到一些代码重载操作符new没有使用new和delete关键字时,我不知道发生了什么。我读到的代码如下:重载运算符new而不使用关键字new和malloc? 我试图更好地理解C++中的内存分配。关于WEBs有很多概念和理论,但是我找不到C++全局运算符新的真正的源代码。 我理解只需重载运算符new和delete即可: void* operator new(size_t size){ void* allocated = malloc(size); //allocate necessary space; return allocated; } void operator delete(void* ptr){ SA<T>* p = static_cast< SA<T>* >(ptr); return free(p); } void*运算符新建(大小){ void*allocated=malloc(size);//分配必要的空间; 分配的回报; } void操作符删除(void*ptr){ SA*p=静态铸件(ptr); 免费返回(p); },c++,memory-management,operator-keyword,dynamic-memory-allocation,C++,Memory Management,Operator Keyword,Dynamic Memory Allocation,但是当我看到一些代码重载操作符new没有使用new和delete关键字时,我不知道发生了什么。我读到的代码如下: #include <stddef.h> struct Head { long length; struct Head *next; ) ; static Head pool = { 0, 0 }; static Head *h = (Head *)HEAP_BASE ADDRESS; /* fast dumb first-fit allocator */ t
#include <stddef.h>
struct Head {
long length;
struct Head *next;
) ;
static Head pool = { 0, 0 };
static Head *h = (Head *)HEAP_BASE ADDRESS;
/* fast dumb first-fit allocator */
typedef char *Char_p;
// NEXT LINE IS MACHINE AND COMPILER DEPENDENT:
const long WRDSIZE = sizeof (void*) ;
void* operator new(size_t nbytes)
{
/* First, look in free list */
if (pool.next){
Head *prev &pool;
for (Head *cur = &pool; cur; cur = cur->next) {
if (cur->length >= nbytes) {
prev->next - cur->next;
return (void*) (Char_p(cur) + sizeof(Head));
}else prev = cur;
}
}
/* Nothing on free list, get new block from heap */
h = (Head*) (((int) ((Char_p(h)+WRDSIZE-1))WRDSIZE)*WRDSIZE);
h->next = 0;
h->length = nbytes;
h = Char_p(h) + nbytes + sizeof(Head);
return (void*) (Char_p(h) - nbytes);
}
#包括
结构头{
长度长;
结构头*下一步;
) ;
静态头池={0,0};
静态磁头*h=(磁头*)堆_基址;
/*快速哑第一拟合分配器*/
typedef char*char\u p;
//下一行取决于机器和编译器:
const long WRDSIZE=sizeof(void*);
void*运算符新(大小为字节)
{
/*首先,查看免费列表*/
if(pool.next){
总目*prev&pool;
对于(Head*cur=&pool;cur;cur=cur->next){
如果(当前->长度>=N字节){
上一步->下一步-当前->下一步;
返回(无效*)(字符p(cur)+sizeof(Head));
}else-prev=cur;
}
}
/*空闲列表中无任何内容,从堆中获取新块*/
h=(Head*)((int)((Char_p(h)+WRDSIZE-1))WRDSIZE)*WRDSIZE);
h->next=0;
h->长度=N字节;
h=字符p(h)+n字节+大小f(头);
返回(void*)(字符p(h)-n字节);
}
没有调用一个新的或malloc。这如何分配内存???源代码将调用其他库或非常复杂。这不太可能对您有所帮助。它很可能是
malloc
。如何实现这一点是任何编译器的选择。不会有任何常见的源代码。因此,是否有可能重载ope在不使用关键字new或malloc的情况下执行新操作?如果您希望执行的操作是替换全局运算符new
和delete
,请参阅