堆 - 构造函数和析构函数,内存分配

时间:2015-10-13 12:09:59

标签: c++

我有一个带有构造函数和析构函数的类以及另一个方法。 当我创建这个类的新实例时,它会在某处调用析构函数,我不知道为什么。

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;
}

1 个答案:

答案 0 :(得分:3)

在运行这个非标准代码 1 的过程中,无论如何最有可能产生未定义的行为 2 ,这一行< / p>

Heap *name = &Heap(k);

生成一个临时Heap对象,该对象在该完整表达式结束时被销毁。这导致析构函数被调用。

请注意,事实仍然是您的课程非常脆弱,因为它不遵循the rule of three (five)。复制Heap个对象会导致双重删除。

1有充分理由,标准C ++不允许使用临时地址。
2这种结构让你有一个悬垂的指针。从技术上讲,取消引用name会导致未定义的行为。