我很想知道malloc
如何分配记忆(你能告诉我吗?),所以我尝试了一些东西。
这是分配内存的坏方法吗?
void* myMalloc(unsigned int size) {
return (void*) new bool[size];
}
答案 0 :(得分:6)
C ++标准明确指出C malloc
和free
函数不能调用operator new
或operator delete
(C ++中的20.6.13 / 3和4) 11 FDIS)。这让我脑子里的红灯闪烁......
除此之外,您的方法转储所有类型安全new
可能会让您malloc
缺少。而且你的实现对它的实现来说太慢了。
结论:是的,这是一种分配内存的坏方法。
答案 1 :(得分:4)
有些错误:
1)你假设sizeof(bool) == 1
,这不一定是真的。
return (void*) new bool[size];
到
return (void*) new char[size];
2)你将如何释放记忆?你必须做类似的事情:
char* x = myMalloc(unsigned int size);
delete[] x; //not free, since you actually use new and not malloc
3)malloc
不会调用new
,它可能是另一种方式(在VS20xx中会调用malloc
)。 malloc
也不会调用构造函数,因此如果这样做有效,它只适用于基本类型。
答案 2 :(得分:3)
我讨厌不同意相当这么多人建议您使用new char[n]
,但我觉得有必要这样做。
由于您要分配“原始”内存而不是对象,因此您应该使用::operator new
代替new some_type[some_size]
:
void *myMalloc(size_t size) {
return ::operator new(size);
}
最终,new char[whatever]
并不是特别有害,但(至少是IMO)它在概念上是错误的,我认为没有直接使用::operator new
的优势。
答案 3 :(得分:0)
malloc()
/ free()
不一定与new
和delete
兼容。 new
可能会调用malloc()
(至少默认情况下),但您不应指望它。
malloc()
和new()
之间的一个主要区别是malloc()
返回指向原始内存的void*
,而new
返回一个类型指针并调用构造函数,如果有的话(和delete
调用析构函数)。
如果您正在编写C ++,那么很少有理由分配原始的无类型内存。
但如果你真的想这样做,你可以写下这样的东西:
void *p = (void*)new char[size];
答案 4 :(得分:0)
如果要使用new[]
分配一定数量的字节,请使用new char[n]
。与bool
不同,sizeof(char)
保证为1。
关于new
和malloc
的实现,new
是一个更高级别的构造(因为它也为具有这些构造的类型调用构造函数),因此可能以malloc
,而不是相反。