使用友元函数重载新运算符

Overloading new operator using friend function

我已经重载了 'new' 运算符作为我的 class 数组的成员函数。我需要帮助将其重载为友元函数。请参阅下面的程序:

#include<iostream>
using namespace std;

class Array {
    private:
    int *arr;
    int size;

    public:

    void * operator new (size_t size)
    {
        void *ptr = ::new Array;
        return ptr;
    }

    void operator delete(void *ptr)
    {
        ::delete ptr;
    }

    Array(int n=5)
    {
        this->size = n;
        this->arr = new int[n];
    }

    void input()
    {
        cout<<"Enter the values"<<endl;
        for(int i=0; i<size; i++)
            cin>>arr[i];
    }

    void show()
    {
        for(int i=0; i<size; i++)
            cout<<arr[i]<<" ";

        cout<<endl;
    }
};

int main()
{
    Array *A = new Array(4);
    A->input();
    A->show();
    return 0;
}

我在友元函数中尝试做的事情:

void * operator new (size_t size) throw (std::bad_alloc)
{
   void * ptr = ::new Array;
   return ptr;
}

我为此陷入了无限循环。有人可以帮我吗?

编辑:语法

只能有一个::operator new(size_t)。通常标准库会提供一个。如果您提供一个,它将 替换 (不会超载)标准库提供的那个。

您的版本无条件地调用自身(没有其他 ::operator new(size_t)),因此存在无限递归和堆栈溢出。

您无法提供 ::operator new(size_t),希望它能与系统提供的 ::operator new(size_t) 一起使用,但仅适用于您的 class。

使全局重载的唯一方法 operator new 是给它一个不同的签名,例如

enum foo {bar};
void* operator new (std::size_t size, foo) { ... }

...

Array* arr = new (bar) Array;

但是您可以使用它来分配任何类型,而不仅仅是 Array,无论哪个 classes 决定与它成为朋友。

所以只需添加上面的答案,您就可以按照以下方式重载您的 operator new 和 delete,这将起作用,因为内部构造函数将调用 operator new[] 而不是 operator new.Also 不需要交这个朋友,因为您没有在此函数中访问任何私有数据成员:

#include <iostream>
#include <string>
using namespace std;
class Array {
    private:
    int *arr;
    int size;

    public:             
    Array(int n=5)
    {
        this->size = n;
        this->arr = new int[n];
    }
    void input()
    {
        cout<<"Enter the values"<<endl;
        for(int i=0; i<size; i++)
            cin>>arr[i];
    }
    void show()
    {
        for(int i=0; i<size; i++)
            cout<<arr[i]<<" ";

        cout<<endl;
    }
};
void * operator new (size_t size)
{
   void *ptr = std::malloc(size);
   return ptr;
}
void operator delete(void *ptr)
{
   std::free(ptr);
}
int main()
{
    Array *A = new Array(4);
    A->input();
    A->show();
    return 0;
}