你能用C ++混合free和constructor吗?

时间:2010-09-10 17:48:36

标签: c++ constructor free malloc

  

可能重复:
  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的问题。

4 个答案:

答案 0 :(得分:11)

不,它无效。我们无法保证new将使用mallocdelete将使用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)

  1. free()不会调用析构函数。它只是释放内存,没有问题。

  2. new / delete无法保证使用malloc()作为内存分配器; free可能甚至不知道你在扔它的记忆