0%

new / delete in C++

在C++中,new / delete 總共有三種用法。new跟delete的用法類似,所以就以new來示範。

operator new

詳細細節可以參考operator newoperator new, operator new[]
可以透過function overload訂製自己的new和delete動作。
operater new/delete就相對於C語言的malloc/free。因此透過operator new分配到的記憶體就該用operator delete釋放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct Object {
Object() {std::cout << '*' << std::endl; } // print an asterisk for each construction
void* operator new(size_t size)
{
return ::operator new(size);
}
void operator delete(void *ptr)
{
return ::operator delete(ptr);
}
void* operator new[](size_t size)
{
return ::operator new[](size);
}
void operator delete[](void *ptr)
{
return ::operator delete[](ptr);
}
};
Object *obj = new Object;
delete obj;

這時就會使用Object裡面的new/delete的函式了。

Placement new

Placement new只是operator new的一種overload版本

1
2
3
4
inline void *operator new(size_t, void *_Where) 
{
return (_Where);
}

詳細使用可以參考C++ FAQ中的介紹。
我們可以從任何記憶體位置(在Heap或是Stack都行)進行new constructor的動作。

1
2
3
4
5
6
7
8
void *pMemory = malloc(sizeof(Object));
Object *pObj1 = new (pMemory) Object;
pObj1->~Object();
free(pMemory);

char stackObj[sizeof(Object)];
Object *pObj2 = new (stackObj) Object;
pObj2->~Object();

Placement new的存在是有意義的,可以自由控制Memory的取得方式,可以從Stack/Heap/Memory Pool中取得記憶體,對於某些情景之下有更大的

new operator

這大概是最常見的動作,基本上就是以下兩個步驟構成

  • 呼叫 operator new
  • 呼叫 Constructor
    這個順序是固定的,無法opverload,這是C++ Standard所規定的。