使用new与C++构造函数一起使用使用C malloc的方式

3

在C++类的构造函数中使用malloc函数并使用new来创建对象实例是否安全?我知道通常情况下两者混用是不安全的,但在这种情况下是否可能/安全呢?


你正在寻找placement new吗? - πάντα ῥεῖ
1
是的,它可以工作:你的问题是否与以下代码类似:struct A { int* val; A() : val(malloc(sizeof(int)) {} ~A() { free(val); }; A* = new A; - Franck
2
我认为,如果构造函数包含指向malloc分配的内存的指针,并且析构函数释放它,则使用new分配构造的对象没有问题。虽然这不是通常的做法,但只要您仔细地将两组内存分配问题分开处理,就应该没问题。如果您想整体上使用malloc()分配对象,则会遇到问题 - 这样做是徒劳无功的。 - Jonathan Leffler
1
当调用C库时,这种情况经常发生。 C库的init函数通常会进行许多malloc调用,并且我从构造函数中调用了它。 - Zan Lynx
1个回答

7
  1. 是的,你可以这样做,但你需要有一个很强的理由。 new 运算符会调用构造函数,它在许多方面就像一个普通的 class 方法。你还应该在析构函数中添加 free() 部分。

    但请注意,如果你使用 malloc() 分配 对象,那么该对象的构造函数将不会被调用。我认为在 程序中使用 malloc() 的原因非常少:你可能希望稍后使用 realloc(),这是一个原因。但你总是可以使用本地 对象,如 容器。

  2. 程序中使用两种分配内存的方法并不不安全,你只需要小心不要 malloc() 一些东西然后 delete 它或者 new 一些东西然后 free() 它。但是对于 malloc(),你始终需要小心很多事情,例如它返回 NULL 和释放已分配的内存,所以这并不是额外的事情。

    再次强调,你能做的最危险的事情就是 malloc() 一个 对象。因为如我所说,构造函数不会被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接