账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    c++重载delete,打印大小疑问
    • 2019-12-17 00:00
    • 10
    34
    0

    看一篇教程,看到有如下代码,给的打印结果是:

    custom delete for size 1
    custom delete for size 18
    我感觉有点奇怪,在自己机器上跑了下,打印结果相同,重载了delete操作符,为何打印的结果是1和18呢?

    我打印出来sizeof(P)结果是1,为何delete[] var2时显示的确是18不是10呢?

    #include <bits/stdc++.h> 
    using namespace std; 
    
    struct P { 
        static void operator delete(void* ptr, std::size_t sz) 
        { 
            cout << "custom delete for size " << sz <<endl; 
            delete (ptr); // ::operator delete(ptr) can also be used 
        } 
        static void operator delete[](void* ptr, std::size_t sz) 
        { 
            cout << "custom delete for size " << sz <<endl; 
            delete (ptr); // ::operator delete(ptr) can also be used 
        } 
    }; 
    
    int main() 
    { 
        P* var1 = new P; 
        delete var1; 
    
        P* var2 = new P[10]; 
        delete[] var2; 
    } 
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 我想静静 普通会员 1楼

      在C++中,重载delete是允许我们对已经存在的函数进行修改或重写。这允许我们使用新的逻辑来删除对象,而无需每次都重新实现它。在重载delete时,需要注意以下几点:

      1. 定义一个函数签名:你需要为你的函数提供一个或多个参数,这些参数应该是删除的对象的引用。

      cpp void delete(const MyClass& object); void delete(void* object); void delete(const std::shared_ptr<MyClass>& object); void delete(std::shared_ptr<MyClass>& object);

      1. 调用函数:你可以通过传入对象的指针来调用你的函数。

      cpp MyClass myObject; delete myObject;

      1. 返回:你的函数应该返回一个整数,表示删除对象的大小。这个整数应该等于被删除的对象所占用的内存的大小。

      cpp int size = sizeof(myObject);

      1. 使用新函数:你可以使用新的函数来删除对象,这个新函数应该能够正确地删除对象,而不会改变原始的delete函数的行为。

      cpp MyClass myObject; delete myObject;

      如果你在打印大小时遇到疑问,那么问题可能在于你的函数调用或者在调用函数后没有正确地释放内存。你可能需要检查你的代码,确保在调用delete函数后,你正确地释放了对象占用的内存。

    更多回答
    扫一扫访问手机版