【发布时间】:2011-09-12 18:19:18
【问题描述】:
我正在实现一个二进制堆类。堆被实现为一个动态分配的数组。堆类具有成员容量、大小和指向数组的指针,如:
class Heap
{
private:
Heap* H;
int capacity; //Size of the array.
int size; //Number of elements currently in the array
ElementType* Elements; //Pointer to the array of size (capacity+1)
//I've omitted the rest of the class.
};
我的构造函数如下所示:
Heap::Heap (int maxElements)
{
H = ( Heap* ) malloc ( sizeof ( Heap ) );
H -> Elements = ( ElementType* ) malloc ( ( maxElements+1 )*sizeof ( ElementType ) );
H -> Elements[0] = DUMMY_VALUE; //Dummy value
H -> capacity = maxElements;
H -> size = 0;
}
由于我在构造函数中分配了两次并取消引用两个指针,我应该检查它是否成功。但是如果失败了我该怎么办?构造函数本身不能返回任何东西来表明它失败了。完全避免构造函数中的 malloc 是一种好的编程习惯吗?
【问题讨论】:
-
你好,@Sahil!欢迎来到堆栈溢出。感谢您粘贴与您的问题相关的代码,但请在您提出下一个问题时将其格式化为代码(每行缩进四个空格,或使用标有
{}的按钮)。另外,我认为您根本不需要H成员变量。Heap对象的空间在输入构造函数时已经分配。您只需要为Elements数组分配空间。 -
我不明白为什么你的 Heap 对象里面有一个指向另一个 Heap 对象的指针,尤其是当你不使用你正在构建的对象的成员时。我会丢失第一个
malloc并直接使用您的对象的成员。 -
实际上,让指针
H指向没有运行构造函数的内存是非常糟糕的做法。我敢打赌,取消引用H会调用未定义的行为。为什么不直接在课堂上存储capacity、size和Elements? -
在 C++ 代码中避免
malloc是一种很好的编程习惯,而不仅仅是构造函数。搜索 RAII 和operator new,然后研究智能指针,以获得首选的 C++ 内存管理方法。 -
在内部使用向量。
标签: c++ class constructor malloc oop