最近在寫資料結構的時候, 被困擾與 C++ 的 operator new
和 new
其實在《C++ Primer》中有對於 operator new
的介紹, 但是僅限於其多載. 也就是說 operator new
本質上是一個函式, 只不過形式和普通的函式或者成員函式不太一樣
對於 operator new
分配的記憶體來說, 需要使用 operator delete
來回收, 這裡有一個和 new
不同的是, 如果 operator new
配置的記憶體是一個陣列的話, 使用 operator delete
進行回收的時候, 只需要放入指向陣列的第一個指標即可, 也就是 operator new
就像 C 的程式庫函式 malloc
與 free
一樣. 而實際上, operator new
和 operator delete
低層也確實是使用 malloc
和 free
實現的
遇到這個問題是因為, 我把 operator delete
當成了 delete
. 原本以為也要像 delete
一樣一個一個進行釋放, 但是沒想到是一次性全部回收掉的. 後來轉念一想, operator delete
低層不就是使用 free
嗎? 於是問題得以解決
《C++ Primer》中只是提到了 operator new
和 operator delete
的多載, 對於這一點並沒有提及, 所以當時對我造成了困擾
範例 :
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
auto p {reinterpret_cast<int *>(::operator new (sizeof(int) * 10))};
for(auto i {0}; i < 10; ++i) {
p[i] = i;
}
for(auto i {0}; i < 10; ++i) {
cout << p[i] << "\t";
}
cout << endl;
::operator delete (p);
}
自創文章, 原著 : Jonny, 如若需要轉發, 在已經授權的情況下請註明出處 :《C++ 的 new、operator new、delete 與 operator delete》https://jonny.vip/2018/07/01/cplusplus-%e7%9a%84-new%e3%80%81operator-new%e3%80%81delete-%e8%88%87-operator-delete/
Leave a Reply