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

Is this way to allocate memory bad?

本文关键字:方式不 分配 内存      更新时间:2023-10-16

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

这是一个不好的方式分配内存吗?

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

c++标准明确规定mallocfree函数不能调用operator newoperator delete (c++ 11 FDIS中的20.6.13/3和4)。这让我的脑海里闪起了红灯……

除此之外,您的方法转储了new可以提供的malloc所缺乏的所有类型安全。而且你的实现对于它所做的事情来说太慢了。

结论:是的,这是一种糟糕的分配内存的方式

以下是一些错误:

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中new将调用malloc)。malloc也不调用构造函数,所以如果它工作,它将只对基本类型工作。

我讨厌不同意那么多人建议您使用new char[n],但我觉得有义务这样做。

因为你想分配"原始"内存,而不是对象,你应该使用::operator new而不是new some_type[some_size]:

 void *myMalloc(size_t size) { 
     return ::operator new(size);
 }

最终,new char[whatever]并不是特别有害,但(至少在我看来)它在概念上是错误的,我认为直接使用::operator new没有任何优势。

malloc()/free()不一定与newdelete兼容。new可以很好地调用malloc()(至少在默认情况下),但您不应该指望它。

malloc()new()之间的一个主要区别是malloc()返回指向原始内存的void*,而new返回类型指针并调用构造函数(如果有的话)(delete调用析构函数)。

如果你正在编写c++,很少有好的理由分配原始的无类型内存。

但是如果你真的想这样做,你可以这样写:

void *p = (void*)new char[size];

如果您想用new[]分配一定数量的字节,请使用new char[n]。与bool不同,sizeof(char)保证为1。

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