|
|
@@ -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;
|
|
|
}
|
|
|
```
|