如何讓new操作符不分配記憶體,只調用建構函式

來源:互聯網
上載者:User
 

問題:c++中的new操作符 通常完成兩個工作 分配記憶體及調用相應的構造出世核函數。
請問:
1)如何讓new操作符不分配記憶體,只調用建構函式?
2) 這樣的用法有什麼用?

解答:(要求new顯式調用建構函式,但不分配記憶體。)

題目要求不能產生記憶體 還要調用建構函式 說明這個類裡面沒有對內部操作 但可以對外部操作 比如static的數

摘錄:如果我是用new指派至的,可以顯式調用解構函式嗎?
可能不行。除非你使用定位放置 new.

class Fred
{public:
      Fred()
      {
            cout<<"fuck";
            }
     
      };
int main()
{
   
    Fred*f=new((void*)10000)Fred();
    system("pause");  
}   其中這個10000可以是任意數,但不能為0

2)
定位放置new(placement new)有很多作用。最簡單的用處就是將對象放置在記憶體中的特殊位置。這是依靠 new運算式部分的指標參數的位置來完成的:

 

#include <new>        // 必須 #include 這個,才能使用 "placement new"
#include "Fred.h"     // class Fred 的聲明

void someCode()
{
   char memory[sizeof(Fred)];     // Line #1
   void* place = memory;          // Line #2

   Fred* f = new(place) Fred();   // Line #3 (詳見以下的“危險”)
   // The pointers f and place will be equal

   // ...
}
Line #1 在記憶體中建立了一個sizeof(Fred)位元組大小的數組,足夠放下 Fred 對象。Line #2 建立了一個指向這塊記憶體的首位元組的place指標(有經驗的 C 程式員會注意到這一步是多餘的,這兒只是為了使代碼更明顯)。Line #3 本質上只是調用了建構函式 Fred::Fred()。Fred建構函式中的this指標將等於place。因此返回的 f 將等於place。  
Line #3 本質上只是調用了建構函式 Fred::Fred()。

*********************************************************

placement new的作用就是:建立對象但是不分配記憶體,而是在已有的記憶體塊上面建立對象。

用於需要反覆建立並刪除的對象上,可以降低分配釋放記憶體的效能消耗。
#include <iostream>
#include <new>

const intchunk = 16;
class Foo
{
public :
int val( ) { return _val; }
Foo( ) { _val = 0; }

private :
int_val;
};

//預分配記憶體,但沒有Foo對象
char*buf = new char[ sizeof(Foo) * chunk ];

int
main( void )
{
//在buf中建立一個Foo對象
Foo*pb = new (buf) Foo;

//檢查一個對象是否被放在buf中
if ( pb->val() == 0 )
{
cout <<"new expressio worked!" <<endl;
}

//到這裡不能再使用pb
delete[] buf;

return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.