是否有理由使用 malloc 初始化构造函数中的指针

Would there ever be a reason to initialize a pointer in a constructor with malloc?

本文关键字:构造函数 指针 初始化 malloc 有理由 是否      更新时间:2023-10-16

这样:

class MyClass{
public:
    int *property;
    MyClass(){
        property = (int*)malloc(sizeof(int));
    }
    ~MyClass(){
        free(property);
    }
};

我知道有更好的方法可以做到这一点,但我认为我不明白为什么这是不正确的。

是否有理由使用 malloc 初始化构造函数中的指针?

我想到至少有几个原因:

  • 您需要使用 C 代码/库并在那里传递预期由 malloc() 初始化的指针

  • 您的资源有限,并希望能够使用它realloc()

可能还有更多,但是在使用原始指针时需要小心,无论是由new初始化还是malloc()。例如,您的类违反了 3/5/0 规则。处理这个问题的最佳方法 - 使用智能指针。

您还需要记住,对于malloc(),您需要确保内存已正确初始化,可以通过具有 POD 类型的memset()或简单分配来完成,或者(这对于非 POD 是强制性的(通过放置 new 来完成。这种用法并非微不足道,因此您希望在真正需要时处理它。

一般来说,

你应该在 c++ 代码中使用new而不是malloc。唯一不这样做的时间是在极端极端情况下,由于某种原因想要控制确切的位置,构建自定义内存池(即使这样,您也应该重载 new,以免直接在类定义中调用 malloc(。在这种情况下,您可以使用"新版位">

使用 new 的主要原因是它将正确构造它刚刚创建的对象。 malloc 将返回垃圾内存。与整数无关(也许(,但对于对象<</p>

div class="answers"肯定很重要>

您必须确保禁用在 c++ 中默认生成的复制构造函数/赋值运算符。如果不这样做,您将有未定义的行为。例如,下面的代码将销毁两次。

#include<cstdlib>
static int number_of_constructions = 0;
static int number_of_destructions = 0;
struct S {
    int * p;
    S() {
        p = (int*) malloc(sizeof(int));
        number_of_constructions++;
    }
    ~S() {
        free(p);
        number_of_destructions++;
    }
};
void foo() {
    S s;
    S s2 = s;    
}

链接: https://godbolt.org/g/imujg1