new關鍵字建立出來的物件位於什麼地方?
你會直接回答在堆空間內嗎,有沒有想過會在其他地方,比如在靜態儲存區。
讓我來分析一下你就明白了。
首先我們要明確的是:
– new/delete 的本質其實是 c++ 預定義的操作符
– c++對這兩個操作符做了嚴格的定義行為
new:
獲取足夠大的記憶體空間(預設為堆空間)
在獲取的空間中呼叫建構函式建立物件
delete:
呼叫析構函式銷毀物件
歸還物件所占用的空間(預設為堆空間)
既然 new 和 delete 是操作符,那我們在 c++ 中就可以對其進行過載
那怎麼過載
// 不論你寫不寫static,他都是靜態函式
// static member function
void
*operator
new(
unsigned
int size)
// static member function
void
operator
delete
(void
* p)
我們試試在靜態儲存區里建立動態物件,使 new 出來的物件不再堆空間,而是在靜態儲存區。
#include
using
namespace std;
class
test
void
*operator
new(
unsigned
int size)
}return ret;
}void
operator
delete
(void
* p)}}
};//靜態成員類外初始化
char test::c_buffer[
sizeof
(test)
*test::count]=;
char test::c_map[test::count]=;
intmain()
;for
(int i =
0;i<
6;i++
)for
(int i =
0;i<
6;i++
)return0;
}
是不是覺得很神奇。這個方法可以規定這個類能產生多少個物件。
能不能做到在指定的位址上建立c++物件?
解決方案
#include
#include
//提供 malloc calloc free
using
namespace std;
class
test
// 用來設定空間的函式
static
bool
setmemorysource
(char
* memory,
unsigned
int size)
else
return ret;
}void
*operator
new(
unsigned
int size)}}
else
return ret;
}void
operator
delete
(void
* p)
}else}}
};//靜態成員類外初始化
char
* test::c_buffer =
null
;char
* test::c_map =
null
;unsigned
int test::count =0;
intmain()
;char buffer[12]
=;// char buffer[1] = ;
// 把這塊空間設定進去
test::
setmemorysource
(buffer,
sizeof
(buffer));
test* pa[6]
=;for(
int i =
0;i<
6;i++
)for
(int i =
0;i<
6;i++
)return0;
}
C 自定義記憶體 管理
工作中常常需要,將一些資料放到記憶體中處理,有時候資料量好大多達3g的空間。而且自己儲存都是一些指標之類的東西,每次都要new,容器中儲存的量好大,四五百萬個。而且最頭疼的就是 析構的時候要等好久才能釋放掉這個東西。查了好久 發現最流行的就是 空間換時間。說了也慚愧,在學校中沒怎麼學到高深的東西,好...
delphi 自定義記憶體管理
1.主要通過getmemorymanager來hook原來的記憶體管理。2.通過setmemorymanager來設定你自己的新的記憶體管理,可以用乙個記憶體池來優化和管理程式的記憶體呼叫情況。procedure registermemmgr varamgr tmemorymanagerex beg...
過載new delete自定義記憶體管理
new delete是c 預定義的操作符。new delete行為 new 1 獲取足夠大的記憶體空間 預設是堆空間 2 呼叫類的建構函式建立物件 delete 1 呼叫析構函式銷毀物件 2 記憶體空間 預設為堆空間 不管是new還是delete操作,都有兩步,new和delete操作是對稱的。c ...