一道有趣的delete题目

#include <iostream>
#include <string.h>
using namespace std;

void* operator new[](size_t size)
{
    cout << "void *operator new[](size_t size)" << endl;
    void* p = (void*)malloc(size);
    cout << p << endl;
    return p;
}

void operator delete[](void* phead)
{
    cout << "void operator delete[](void *phead)" << endl;
    cout << phead << endl;
    free(phead);
}

int main(int argc, char* argv[])
{
    int* temp = new int[10];
    //delete[] temp;
    for(int i = 0; i < 10; i++)
    {
        /*& temp[i]相当于
        &(*(temp + i)),本质上就是temp的首地址加偏移量
        比如i为0,那么偏移量就是0,i为1偏移量就是4,
        所以,当i等于0的时候,已经将new出来的内存完整的释放了,
        当i为1的时候,实际上这里有两个错误,一个是
        (1)由于偏移量的原因,free的时候,传进去的起始地址已经不是
        new出来的首地址了。
        (2)就是free两次的问题,把一个不属于自己的内存再次free*/
        delete& temp[i];
    }
}

linux平台测试:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

void* operator new[](size_t size)
{
    cout << "void *operator new[](size_t size)" << endl;
    void* p = (void*)malloc(size);
    cout << p << endl;
    return p;
}

void operator delete[](void* phead)
{
    cout << "void operator delete[](void *phead)" << endl;
    cout << phead << endl;
    free(phead);
}

int main(int argc, char* argv[])
{
    int* temp = new int[10];
    //delete[] temp;
    for(int i = 0; i < 10; i++)
    {
        /*& temp[i]相当于
        &(*(temp + i)),本质上就是temp的首地址加偏移量
        比如i为0,那么偏移量就是0,i为1偏移量就是4,
        所以,当i等于0的时候,已经将new出来的内存完整的释放了,
        当i为1的时候,实际上这里有两个错误,一个是
        (1)由于偏移量的原因,free的时候,传进去的起始地址已经不是
        new出来的首地址了。
        (2)就是free两次的问题,把一个不属于自己的内存再次free*/
        delete& temp[i];
    }
}

在这里插入图片描述
没有提示内存泄漏,只是提示了,new与delete不匹配。说明内存已经释放了,释放的语句为
delete &temp[0];

将代码稍微改一下:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

void* operator new[](size_t size)
{
    cout << "void *operator new[](size_t size)" << endl;
    void* p = (void*)malloc(size);
    cout << p << endl;
    return p;
}

void operator delete[](void* phead)
{
    cout << "void operator delete[](void *phead)" << endl;
    cout << phead << endl;
    free(phead);
}

int main(int argc, char* argv[])
{
    int* temp = new int[10];
    //delete[] temp;
    for(int i = 0; i < 10; i++)
    {
        /*& temp[i]相当于
        &(*(temp + i)),本质上就是temp的首地址加偏移量
        比如i为0,那么偏移量就是0,i为1偏移量就是4,
        所以,当i等于0的时候,已经将new出来的内存完整的释放了,
        当i为1的时候,实际上这里有两个错误,一个是
        (1)由于偏移量的原因,free的时候,传进去的起始地址已经不是
        new出来的首地址了。
        (2)就是free两次的问题,把一个不属于自己的内存再次free*/
        delete& temp[2]; 
    }
}

在这里插入图片描述
可以看到提示,free的时候,是释放不属于自己的内存。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值