因此:
class MyClass{
public:
int *property;
MyClass(){
property = (int*)malloc(sizeof(int));
}
~MyClass(){
free(property);
}
};
我知道有更好的方法可以做到这一点,但我不认为我理解为什么这是错误的。
答案 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;
}