2013-12-13 44 views
0

我在C++中編寫內存管理器 - 也就是從堆中分配大量字節的類,然後爲我的程序使用分配和釋放函數。C++中的動態類類型

void* allocate(int size); 
void deallocate(void*, int size); 

這工作得很好,但我不喜歡它,我需要這樣做是爲了使用它:

CClass* myobject = (CClass*) manager->allocate(sizeof(CClass)); 

所以我的問題是,有沒有辦法通過類類型的功能,而不是使用空指針?這將消除對cast和sizeof調用的需要,並且它也可以消除將對象大小傳遞給釋放函數的需要。

有誰知道更好的方法,我可以做到這一點?

+1

模板ftw。順便說一句這些類是否有構造函數和析構函數? – doctorlove

+0

你的意思是CClass?當我使用這種方法時,它的構造函數和析構函數將不會被調用,我意識到這一點。 – user2226001

回答

5

您可以使用模板功能。

簡單的例子:

#include <string> 
#include <iostream> 
using namespace std; 

template<typename T> 
T* allocate() { 
    return (T*) malloc(sizeof(T)); 
} 

int main() { 
    int *s = allocate<int>(); 
    *s = 42; 
    return *s; 
} 
+0

這看起來很完美,謝謝! – user2226001

+0

爲什麼不使用標準的'new'關鍵字?這似乎是多餘的,但不潔...... – lucas92

+0

夠公平的,但'新的T()'也會調用構造函數,這只是爲了分配它。該示例只是爲了顯示模板。 – Vlad

0

可以重載運算符新,和operator delete任何特定用戶定義類型,使這些運營商使用分配,而不是默認堆分配的。