簡體   English   中英

:: operator new(sizeof(A));,它是如何工作的

[英]::operator new(sizeof(A));, how it works

我認為它分配sizeof(A)內存return地址returnpointer a ,我是對的嗎? 第二個問題是,我不明白這個::operator為什么它使用符號::和單詞operator

A* a = ::operator new(sizeof(A));

是的,你是對的, operator new() (function)與new (關鍵字)不同,它只分配N個字節而不執行對象的初始化。 但是, new關鍵字使用operator new()來分配內存。

與其他(標准)函數不同, operator new()不是std命名空間的一部分,而是位於全局命名空間中。 因此, :: in強制編譯器采用全局定義而不是更專業的定義。 例如:

namespace foo {

    void* operator new (std::size_t size)
    {
        std::cout << "custom implementation" << std::endl;
        // some code...
    }

    void SomeFunc()
    {
         operator new(0);   // prints "custom implementation"
         ::operator new(0); // prints nothing at all
    }

}

好吧,首先這不起作用 - 當你編譯它時你會得到一個錯誤

t.cpp:2:32: error: invalid conversion from ‘void*’ to ‘A*’ [-fpermissive]
 A* a = ::operator new(sizeof(A));
                                ^

就其含義而言,這將在全局范圍內調用函數operator new 普通的全局operator new分配指定的內存量並返回一個void *指針(這就是你得到錯誤的原因)。

重要的是,這不是一個new表達式 - 它只是一個函數調用,它調用通常用於為new表達式分配內存的函數。 它不會調用任何初始化程序以任何方式初始化內存。 這是錯誤的另一個原因。

1) ::被稱為scope resolution operator 在C / C ++中,每個標識符都有一個范圍,在該范圍之外它不存在。 默認情況下,標識符存在於全局命名空間中,除非它們是函數,類或命名空間的成員,它們作為本地標識符存在。 在全局命名空間中聲明的符號/變量/標識符使用::運算符。

因此,您必須使用一元范圍運算符(::)來訪問在全局命名空間中聲明的標識符,因為它可以被隱藏,因為它在塊或類中顯式聲明了與其自身具有相同名稱的另一個標識符。 例如:

    int random_number = 0;

    int main(void)
    {
      int random_number = 0;
      ::random_number = 1;  // set global random_number to 1
      random_number = 2;    // set local random_number to 2
      return 0;
    }

main()函數內聲明的random_number聲明隱藏了在全局命名空間范圍內聲明的名為random_number的整數(在main函數之上)。 通過使用像::random_number這樣的一元范圍運算符,我們可以訪問main()函數內全局命名空間中聲明的變量。

2) operator new()表示一個函數,其聲明為void* operator new ( std::size_t count ); 意味着它分配count字節的內存/存儲。 如果分配請求的內存不足,則operator new()返回NULL或引發exception

暫無
暫無

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

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