【问题标题】:Using new with C++ Constructors that use C malloc将 new 与使用 C malloc 的 C++ 构造函数一起使用
【发布时间】:2017-01-04 16:36:35
【问题描述】:

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

【问题讨论】:

  • 您在寻找placement new吗?
  • 是的,它有效:您对某些代码的问题可能类似于:`struct A { int* val; A() : val(malloc(sizeof(int)) {} ~A() { free(val); }; A* = new A;
  • 我想如果构造函数包含一个指向错误分配内存的指针,而析构函数释放它,那么使用new 分配构造的对象就没有问题。它并不完全按照通常的方式做事,但只要你小心地将两组内存分配问题分开,你应该没问题。如果你正在寻找malloc() 整个对象,那么你就有问题了——你什么也没有。
  • 当然。一直调用 C 库时会发生这种情况。 C库的init函数经常会做很多malloc的调用,我是从构造函数中调用的。

标签: c++ c memory malloc new-operator


【解决方案1】:
  1. 是的,你可以,但你应该有充分的理由。 new 运算符调用构造函数,这在许多方面就像常规的 class 方法一样。您还应该将free() 部分添加到析构函数中。

    但是请注意,如果你 malloc() 一个 对象,该对象的构造函数将不会被调用。我认为在 程序中调用malloc() 的理由很少:您可能希望稍后再调用realloc(),这是原因之一。但您始终可以使用原生 对象,例如 容器。

  2. 程序中使用这两种分配内存的方式并不是不安全的,你只需要注意不要malloc() 某事然后delete 它或new 某事然后free() 它.但是对于malloc(),你总是必须小心很多事情,比如它返回NULLfree()分配的内存,所以这不是额外的事情。

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

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2019-08-10
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多