我想實現一個自定義的內存管理器,我想知道是否有更好的方法來實現這個功能,因爲當我被問及無效指針算術時,幾個人認爲,如果我有一個void *在C++中,有些東西是非常錯誤的。自定義內存管理器
// allocates a page of memory.
void ObjectAllocator::allocatePage()
{
//if(OAStats_.PagesInUse_ >= Config_.MaxPages_)
//throw exception
void* buffer = ::operator new(OAStats_.PageSize_); // allocate memory, no constructor call.
// =============== Setup the PageList_ ===============
GenericObject* pNewNode = ::new(buffer) GenericObject(); // Construct GenericObject for the pagelist.
pNewNode->Next = PageList_->Next; // pNewNode points to wherever PageList_ pointed to.
PageList_->Next = pNewNode; // PageList_ points to pNewNode
pNewNode = NULL; // dont need this handle anymore
buffer = static_cast<char*>(buffer) + sizeof(GenericObject); // move pointer to point after the generic object.
// =============== Setup the FreeList_ ===============
for(int i=0;i<Config_.ObjectsPerPage_;++i)
{
static GenericObject* pPreviousNode = NULL; // static variable to hold the previous node
pNewNode = ::new(buffer) GenericObject(); // Construct GenericObject for the freelist.
pNewNode->Next = pPreviousNode;
pPreviousNode = pNewNode;
buffer = static_cast<char*>(buffer) + OAStats_.ObjectSize_; // move pointer by ObjectSize.
++OAStats_.FreeObjects_;
}
FreeList_->Next = pNewNode;
++OAStats_.PagesInUse_;
++OAStats_.Allocations_;
}
「有幾個人認爲如果我在C++中有一個void *,有些東西是非常錯誤的。」 < - 我不會同意這一點。無效指針有其用途。我想這歸結於你是否是'反C'C++社區的一部分,或者不是。我傾向於說,雖然是的,C++是比C更高級別的語言,但人們通常會在其中做低級別的事情,所以使用其更類似C的功能沒有任何問題。 – Stephen 2010-07-31 12:31:14
@Stephen:爲什麼這麼多程序員有這種膝蓋反射,當一個概念受到批評時,他們只會*說「這不是邪惡的,它有它的用處」。我想你對單身和gotos也一樣。但在這種情況下,void *有什麼用途?他爲什麼要在這裏使用void *? – jalf 2010-07-31 12:59:53
@Jalf因爲負面評論在人們的頭腦中的含義遠遠超過正面評論。這意味着,如果某個剛剛接觸編程的人或者之前沒有聽說過X的人閱讀了一篇評論,指出X不應該使用它,他們很可能會將這些知識視爲他們的頭腦中的事實。另外,我只是在陳述意見。如果我已經備份了「不使用void指針」視圖,你會回答嗎?這裏沒有,沒有理由使用它,但是OP只是說人們告訴他在編寫C++時不要使用它們。 – Stephen 2010-07-31 13:14:35