是否有理由使用 malloc 初始化构造函数中的指针
Would there ever be a reason to initialize a pointer in a constructor with malloc?
这样:
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 来完成。这种用法并非微不足道,因此您希望在真正需要时处理它。
一般来说,
div class="answers"肯定很重要> 你应该在 c++ 代码中使用new
而不是malloc
。唯一不这样做的时间是在极端极端情况下,由于某种原因想要控制确切的位置,构建自定义内存池(即使这样,您也应该重载 new,以免直接在类定义中调用 malloc(。在这种情况下,您可以使用"新版位">
使用 new
的主要原因是它将正确构造它刚刚创建的对象。 malloc 将返回垃圾内存。与整数无关(也许(,但对于对象<</p>
您必须确保禁用在 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
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- 复制构造函数C++无法正确复制指针
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++ 对象指针数组的复制构造函数
- 构造函数 (C++) 中的 char 指针参数存在问题
- 为什么使用 std::istream_iterator 构造函数返回指针
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 使用指向成员函数的指针在另一个类中调用类构造函数
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么指针对象没有调用默认构造函数
- 函数返回时,带指针的复制构造函数失败
- 如何编写复制构造函数来复制指针?
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 使用 Rcpp 公开将指向对象的指针作为参数的构造函数
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 如何正确实现具有原始指针的类的复制构造函数?
- 构造函数主体内的本地指针C++内存泄漏
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 有没有办法通过读取 c++ 中的文件来构造函数指针
- 构造函数指针改变