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

时间:2018-01-30 19:43:21

标签: c++ pointers constructor malloc

因此:

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

我知道有更好的方法可以做到这一点,但我不认为我理解为什么这是错误的。

3 个答案:

答案 0 :(得分:0)

通常,您应该在c ++代码中使用new而不是malloc。唯一不这样做的是在极端情况下,你想要出于某种原因控制确切的位置,构建自定义内存池(即使这样你也应该重载new以便不直接在类定义中调用malloc)。在这种情况下,您使用' placement new'

使用new的主要原因是它将正确构造它刚刚创建的对象。 malloc将返回垃圾内存。对于整体而言(或许)不相关但对于对象来说当然很重要

答案 1 :(得分:0)

  

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

至少有几个理由出现在我的脑海中:

  • 您需要使用C代码/库并将指针传递给那些预期由main

  • 初始化的指针
  • 您的资源有限,希望能够malloc()使用

可能会有更多,但在处理原始指针时需要小心,原始指针由realloc()new初始化。例如,您的班级违反了rule of 3/5/0。处理它的最佳方法 - 使用智能指针。

此外,您需要记住,使用malloc()时,您需要确保内存已正确初始化,可以使用malloc()或使用POD类型的简单分配或(并且这对于非POD)通过新的放置。这种用法并非微不足道,所以当你真正需要时,你会想要处理它。

答案 2 :(得分:0)

您必须确保禁用在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