簡體   English   中英

為什么重載的new運算符正在調用構造函數,即使我在重載函數中使用malloc?

[英]why overloaded new operator is calling constructor even I am using malloc inside overloading function?

我試圖了解重載新運算符。 我編寫了如下代碼。

#include <iostream>
#include <cstdlib>
#include <new>

using namespace std;

class loc
{
    int lo, la;

    public:
        loc()
        {
        }

        loc(int x, int y)
        {
            cout << "In constructor\n";
            lo = x;
            la = y;
        }

        void show()
        {
            cout << lo << " ";
            cout << la << endl;
        }

        void *operator new(size_t sz);
        void operator delete(void *p);
};

void *loc::operator new(size_t sz)
{
    cout << "in Overloaded new\n";
    void *p = malloc(sz);

    return p;
}

void loc::operator delete(void *p)
{
    cout << "in Overloaded delete\n";
    free(p);
}

int main()
{
    loc *p1 = new loc(10, 20);
    p1->show();
    delete p1;
    return 0;
}

我以為它不會調用構造函數,因為我在重載函數中重載了帶有malloc函數調用的new運算符。 但輸出如下。

in Overloaded new
In constructor
10 20
in Overloaded delete

這意味着構造函數被調用。 這怎么可能? 這是否意味着malloc()會調用構造函數?

新表達式導致發生兩個不同的事情:開始創建對象所需的內存分配,以及對象的初始化。

另一方面, 新運算符只處理分配部分。 當您針對特定類重載new運算符時,您將替換對象的內存分配。

當您意識到並非所有對象都在堆上分配時,這種功能划分才有意義。 考慮以下情況:

int main() {
    string someString;
    ..
}

局部變量不是動態分配的; new的沒用過; 但是仍然需要初始化對象,因此仍然會調用構造函數。 請注意,您不需要顯式調用構造函數 - 在語言中隱含的是,在創建對象時,將始終調用適當的構造函數來初始化對象。

當你編寫一個'new expression'時,編譯器知道發出指令來調用new運算符(根據需要分配內存),然后調用構造函數(初始化對象)。 無論是否重載新運算符,都會發生這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM