可能重复:
Is there any danger in calling free() or delete instead of delete[]?
我正在读这个问题:
In what cases do I use malloc vs new?
有人提出使用malloc的一个原因是你打算免费使用。
我想知道:在C ++中混合使用免费调用和构造函数初始化是否有效?
即
我可以说:
my_type *ptr = new my_type;
free(my_type);
这在某种程度上是无效的还是更糟糕的:
my_type *ptr = new my_type;
delete my_type;
除了它不是c ++ ish?
同样,你可以这样做吗?你能说
吗?my_type *ptr = (my_type *)malloc(sizeof(my_type));
delete my_type;
请合并,如果这是重复,我搜索但没有看到关于malloc / delete / new / free ask的问题。
答案 0 :(得分:11)
不,它无效。我们无法保证new
将使用malloc
或delete
将使用free
。
此外,使用free
代替delete
将跳过my_type
的析构函数。如果my_type
本身持有一些资源,那么这些资源将被泄露。同样,malloc
将跳过构造函数,因此变量可能处于无效状态。
答案 1 :(得分:5)
在C ++中混合使用空闲调用和构造函数初始化是否有效?
不,不是。
malloc,calloc,realloc - >自由
new - >删除
new [] - >删除[]
答案 2 :(得分:2)
不,这是无效的。 malloc
(和其他C分配函数)必须与free
匹配,new
必须与delete
匹配,new []
必须与{{1}匹配}}。如果没有析构函数代码,你的编译器可能不一定做任何不同的事情,这不是你应该依赖的东西。
主要区别在于new / delete调用对象的构造函数和析构函数; malloc和free只是将它视为原始的,无类型的内存。
答案 3 :(得分:2)
free()
不会调用析构函数。它只是释放内存,没有问题。
new
/ delete
无法保证使用malloc()
作为内存分配器; free
可能甚至不知道你在扔它的记忆