Explorar o código

重载operator new/delete

usuiforhe %!s(int64=3) %!d(string=hai) anos
pai
achega
ba8ef6b1d4
Modificáronse 1 ficheiros con 84 adicións e 5 borrados
  1. 84 5
      cpp/内存机制.md

+ 84 - 5
cpp/内存机制.md

@@ -317,11 +317,90 @@ inline void operator delete[](void* ptr){
 更常见的写法是**类中重载**
 
 ```cpp
-class Foo{
+class Foo {
 public:
-    void* operator new(size_t size);
-    void operator delete(void*[,size_t]); // 第二个参数size_t可有可无,写不写都行
-    void* operator new[](size_t size);
-    void operator delete[](void*[, size_t]);
+	int _id;
+	long _data;
+	std::string _str;
+
+public:
+	Foo() : _id(0) { std::cout << "default ctor " << this << " " << this->_id << std::endl; }
+	Foo(int i): _id(i) { std::cout << "ctor " << this << " " << this->_id << std::endl; }
+
+	virtual ~Foo() { std::cout << "dtor " << this << std::endl; }
+
+
+	static void* operator new(size_t size);
+	static void operator delete(void* pdead, size_t size);
+	static void* operator new[](size_t size);
+	static void operator delete[](void* pdead, size_t size);
+};
+
+void* Foo::operator new(size_t size) {
+	Foo* p = (Foo*)malloc(size);
+	std::cout << "my alloc Foo " << p << std::endl;
+	return p;
+}
+
+void Foo::operator delete(void* pdead, size_t size) {
+	std::cout << "my delete " << pdead << std::endl;
+	free(pdead);
+}
+
+void* Foo::operator new[](size_t size) {
+	Foo* p = (Foo*)malloc(size);
+	std::cout << "my alloc Foo " << p << std::endl;
+	return p;
+}
+
+void Foo::operator delete[](void* pdead, size_t size) {
+	std::cout << "my delete " << pdead << std::endl;
+	free(pdead);
+}
+
+int main() {
+	std::cout << sizeof(Foo) << std::endl;
+
+	Foo* p = new Foo(7);
+	delete p;
+
+	Foo* pArray = new Foo[5];
+	delete[] pArray;
+	return 0;
+}
+```
+
+```bash
+40
+my alloc Foo 00C2DA78
+ctor 00C2DA78 7
+dtor 00C2DA78
+my delete 00C2DA78
+my alloc Foo 00C30110
+default ctor 00C30114 0
+default ctor 00C3013C 0
+default ctor 00C30164 0
+default ctor 00C3018C 0
+default ctor 00C301B4 0
+dtor 00C301B4
+dtor 00C3018C
+dtor 00C30164
+dtor 00C3013C
+dtor 00C30114
+my delete 00C30110
+```
+
+但是,如果使用`::new`和`::delete`则会绕过类定义的`operator new / operator delete`方法,转而执行**全局的**`new / delete`
+
+```cpp
+int main() {
+	std::cout << sizeof(Foo) << std::endl;
+
+	Foo* p = ::new Foo(7);
+	::delete p;
+
+	Foo* pArray = ::new Foo[5];
+	::delete[] pArray;
+	return 0;
 }
 ```