【问题标题】:overload new and delete operator重载 new 和 delete 运算符
【发布时间】:2013-11-08 14:58:15
【问题描述】:

我有点怀疑。我不知道我的问题是否有效,但我把它放在 SO 中。 第一个问题: 当我们在全局或类级别重载 operator new 和 operator delete(不适用于数组),然后如果我们创建一个对象数组,如下所示:

A* obj = new A[10];
delete []obj;

那么在这种情况下为什么它调用运算符 new 和 delete 即使我没有为数组重载,即我没有像下面这样重载

void* operator new[](size_t size){}

第二个问题: 但是如果我像上面那样重载数组的 new 和 delete 运算符,那么它将调用具有数组语法的那个。

最后但并非最不重要的一点是,如果我根本不重载 new 和 delete 运算符,那么当我创建对象数组时将调用哪个运算符。它是一种数组语法还是普通的一种。 如果我的问题不清楚,请告诉我。

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    当您调用new T[n] 时,内存由operator new[]( size_t ) 分配。如果您替换此功能,那么您的 将调用替换。如果你不替换这个函数, 将调用默认实现,即 定义:

    void*
    operator new[]( size_t n )
    {
        return operator new( n );
    }
    

    也就是说,它转发到非数组operator new 功能。因此,如果您替换了 operator new(),您的 将调用替换。

    (但是你为什么要写new []?我从来没有找到过案例 哪里有用。)

    【讨论】:

    • 所以这意味着我们根本不需要重载new[],只要它和new 做同样的事情,知道有趣。这个委托是标准的还是只是默认 new[] 的最常见实现?
    • "(但是你为什么要做一个新的 []?我从来没有发现它有用的案例。)" - 呃,也许只是为了测试他的重载new-operators 并看到它的行为很奇怪(从他的角度来看)?或者为问题提供 SSCCE?
    • @ChristianRau 这是标准要求的。如果您希望 operator new[]() 具有不同的行为(例如,如果成员 operator new() 从池中分配,并以 assert(size == sizeof(T)); 开头),则只需要重载 operator new[]()
    • 我没有在任何地方使用只是为了我问的知识
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2014-03-26
    • 2013-03-12
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多