2013-12-13 45 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任何特定用户定义类型,使这些运营商使用分配,而不是默认堆分配的。