这种分配内存的方式不好吗?
Is this way to allocate memory bad?
我想知道malloc
将如何分配内存(你能告诉我吗?),所以我尝试了一些东西。
这是一个不好的方式分配内存吗?
void* myMalloc(unsigned int size) {
return (void*) new bool[size];
}
c++标准明确规定malloc
和free
函数不能调用operator new
或operator 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()
不一定与new
和delete
兼容。new
可以很好地调用malloc()
(至少在默认情况下),但您不应该指望它。
malloc()
和new()
之间的一个主要区别是malloc()
返回指向原始内存的void*
,而new
返回类型指针并调用构造函数(如果有的话)(delete
调用析构函数)。
如果你正在编写c++,很少有好的理由分配原始的无类型内存。
但是如果你真的想这样做,你可以这样写:
void *p = (void*)new char[size];
如果您想用new[]
分配一定数量的字节,请使用new char[n]
。与bool
不同,sizeof(char)
保证为1。
对于new
和malloc
的实现,new
是一个更高级的构造(因为它也调用具有这些类型的构造函数),因此可能是根据malloc
实现的,而不是相反。
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么它在不分配内存的情况下工作正常
- 如果不分配内存,我如何能够为变量创建和分配值?
- 是否可以在不分配内存或复制数据的情况下构造对象?
- std::vector X(0) 是否保证不分配
- 搜索为什么不分配内存
- 构造一个不分配的字符串
- C++没有等号,而是在不分配值的情况下进行编译
- 日食快捷方式不起作用
- new 不分配内存
- 新不分配内存?
- 有没有办法在不分配变量的情况下将字符串连接到数字
- 使用指针调用重载而不分配新内存
- 不分配任何字符内存的常量字符串构造函数?
- C++强制 new[] 不分配 4 个额外的字节
- C++ 向量不分配连续内存
- 为什么内存集不分配 1?
- 编辑控件的行为方式不该如此
- 声明数组而不分配内存
- 运算符 [] 和 insert() 函数在 C++ 映射中的行为方式不应该相同吗?