我有一个带有构造函数和析构函数的类以及另一个方法。 当我创建这个类的新实例时,它会在某处调用析构函数,我不知道为什么。
class Heap
{
private:
int *heap;
int size;
int heap_size;
public:
Heap(int new_size)
{
size = new_size;
heap_size = 0;
heap = (int*)malloc(new_size*sizeof(int)); //???
//heap = new int[new_size]; //???
}
~Heap()
{
free(heap);
}
void add(int alfa)
{
// something
}
};
int _tmain(int argc, _TCHAR* argv[])
{
srand(time(NULL));
int k = rand() % 100 + 1;
Heap *name = &Heap(k);
Heap *name2 = new Heap(k); //what's the diffrence?
while (k > 0)
{
name->add(rand()); // doesn't work, because destructor is called before
k--;
}
system("pause");
return 0;
}
答案 0 :(得分:3)
在运行这个非标准代码 1 的过程中,无论如何最有可能产生未定义的行为 2 ,这一行< / p>
Heap *name = &Heap(k);
生成一个临时Heap
对象,该对象在该完整表达式结束时被销毁。这导致析构函数被调用。
请注意,事实仍然是您的课程非常脆弱,因为它不遵循the rule of three (five)。复制Heap
个对象会导致双重删除。
1有充分理由,标准C ++不允许使用临时地址。
2这种结构让你有一个悬垂的指针。从技术上讲,取消引用name
会导致未定义的行为。