在c ++中重载删除操作符

时间:2014-12-21 14:18:16

标签: c++ dynamic-allocation

我在C ++中重载了一个删除操作符,我使用了free()

class A
{
private:
    int x;
    int y;
public:
    void operator delete(void* ptr)
    {
        free(ptr);
    }

    void operator delete[](void* ptr)
    {
        free(ptr);
    }
}

int main()
{
    A *a = new A();
    A *b = new A[10];

    delete a; // This should free 8 bytes
    delete b; // This also 8 only

    delete[] b;// This should free 80 bytes

    return 0;
}

这项工作有多自由

正如我所知,动态分配存储分配为隐藏的大小,因此在释放时它会从那里使用

但是,当我们使用delete b;delete[] b;隐藏分配时,alwyas 80则说明8只能取消分配。

如果它的方法不正确那么我们如何使用free来重载删除操作符?

3 个答案:

答案 0 :(得分:3)

delete array与使用new T[n](对于某些类型T和某些类型n)获得的指针一起使用会导致未定义的行为。

答案 1 :(得分:0)

delete b也知道按照您所期望的delete[] b

分配的大小

delete b位置使用delete [] b可能会导致未定义的行为。您错过的方面是,如果您不使用delete [],则不会调用数组中各个对象的析构函数。

请在此处搜索StackOverflow。

,而不是在此处重复(很多)早期答案

这是一个:delete vs delete[] operators in C++

答案 2 :(得分:0)

newdelete是一对紧密耦合的操作。仅重载其中一个是不正确的,因为它们是相同对象分配方案的两半。

默认的new和delete实现在标准中未指定,因此是实现定义的。

可能是默认新用malloc()在您的系统上分配内存,但它可能不是。