Почему с ++ синглтон не может быть новым, хотя «новое» было перегружено - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок здесь, я узнал, что «новый» оператор может быть перегружен, и когда я вызываю «новый», он сначала вызывает «оператор новый», а затем «конструктор», поэтому мой вопрос:Могу ли я создать новый объект в одноэлементном шаблоне, если перегрузить новый в общедоступной зоне?

class MyClass{
    MyClass(){
        cout<<"contructor"<<endl;
    }

public:
    static MyClass* getInstance()
    {
        static MyClass* mm = new MyClass();
        return mm;
    }
    void* operator new(size_t size)
    {
        cout<<"allocate memory\n";
        void* p = malloc(size);
        return p;
    }
};

int main() {
    MyClass*  m = new MyClass();
    return 0;
}

1 Ответ

0 голосов
/ 21 сентября 2018

когда я вызываю new, он сначала вызовет operator new

Да

, а затем конструктор

Или хотя бы попытается.Проблема в том, что конструктор является закрытым, поэтому вызов извне класса не разрешен.

Вызов конструктору происходит из области выражения new (поэтому "из main" в вашемдело), ​​не из сферы действия operator new.

...