这种方式分配内存不好吗?

时间:2011-10-06 20:04:22

标签: c++ memory-management

我很想知道malloc如何分配记忆(你能告诉我吗?),所以我尝试了一些东西。

这是分配内存的坏方法吗?

void* myMalloc(unsigned int size) {
    return (void*) new bool[size];
}

5 个答案:

答案 0 :(得分:6)

C ++标准明确指出C mallocfree函数不能调用operator newoperator 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()不一定与newdelete兼容。 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。

关于newmalloc的实现,new是一个更高级别的构造(因为它也为具有这些构造的类型调用构造函数),因此可能以malloc,而不是相反。