網易校園招聘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>
using namespace std;
const int chunk = 16;
class Foo
{
public:
int val( ) { return _val; }
Foo( ) { _val = 0; }
private:
int _val;
};
//預分配記憶體,但沒有Foo物件
char*buf = new char[ sizeof(Foo) * chunk ];
int main()
{
//在buf中建立一個Foo物件
Foo*pb = new (buf) Foo;
//檢查一個物件是否被放在buf中
if ( pb->val() == 0 )
{
cout <<"new expression worked!" <<endl;
}
//到這裡不能再使用pb
delete[] buf;
return 0;
}
相關文章
- Golang記憶體分配內建函式之new函式Golang記憶體函式
- C++ 記憶體分配(new,operator new)詳解C++記憶體
- 【C++】C++ 記憶體分配(new,operator new)詳解C++記憶體
- 詳解 JavaScript 建構函式和 "new" 操作符JavaScript函式
- 限定建構函式必須使用new呼叫函式
- 【C/C++】記憶體分配函式:malloc,calloc,realloc,_allocaC++記憶體函式
- [C++]顯示呼叫建構函式和解構函式C++函式
- 【資料結構】網易2012校園招聘題目--平衡二叉樹的插入問題資料結構二叉樹
- 核心記憶體分配常用函式使用記憶體函式
- [C++]記憶體分配C++記憶體
- 關於C++ delete 來釋放new分配的記憶體C++delete記憶體
- C++入門記-建構函式和解構函式C++函式
- C++:建構函式的分類和呼叫C++函式
- Servlet呼叫構造方法,物件傳不進建構函式中去問題Servlet構造方法物件函式
- new、delete、記憶體分配 的底層原理delete記憶體
- 從預設解構函式學習c++,new,delete,記憶體洩漏,野指標函式C++delete記憶體指標
- c++ 虛解構函式[避免記憶體洩漏]C++函式記憶體
- C++關於一個函式中new記憶體洩露的列子C++函式記憶體洩露
- Effective c++(筆記) 中關於建構函式、解構函式以及賦值操作符的知識C++筆記函式賦值
- 控制C++的記憶體分配C++記憶體
- C++ 動態記憶體分配C++記憶體
- C++動態記憶體分配C++記憶體
- C++語言之結構體、類、建構函式、拷貝建構函式C++結構體函式
- C++ 建構函式和解構函式C++函式
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- malloc,calloc,realloc等記憶體分配函式區別記憶體函式
- C++記憶體分配與物件構造的分離C++記憶體物件
- 記憶體分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc記憶體
- 【C++】建構函式C++函式
- C++建構函式C++函式
- c# tcbs之建構函式呼叫建構函式示例C#函式
- c++學習筆記 -- 建構函式C++筆記函式
- C++ 類建構函式和解構函式C++函式
- C++ 解引用與函式基礎:記憶體地址、呼叫方法及宣告C++函式記憶體
- 函式指標、回撥函式、動態記憶體分配、檔案操作函式指標記憶體
- 轉:經典String str = new String("abc")記憶體分配問題記憶體
- 校園招聘的思考
- C/C++記憶體分配以及釋放C++記憶體