当前位置:网站首页>delete和delete[]引发的问题
delete和delete[]引发的问题
2022-07-01 09:12:00 【代码整洁之道】
一、问题1:delete 一个指向array new的指针,导致程序异常退出
Foo* p1 = new Foo[2];
delete p1;

1、arary new的动态申请的内存结构大致如下图(vs2022)
2、通过查看内存布局。
3、在operator delete打断点,发现传进来的指针指向第一个对象的地址,在free函数中导致崩溃。
对比调用delete [] p1,传进来的指针phead是指向记录array size大小的地址。
二、问题2:array delete 一个指向new的指针,导致析构函数不断调用
Foo* p2 = new Foo;
delete [] p2;

1、new的动态申请的内存结构大致如下图(vs2022)
2、通过查看内存布局。
3、在Foo的析构函数打断点,反汇编,发现控制调用析构函数的count是个随机值,导致析构函数不断被调用
三、测试代码
// -------- xxx.hpp
#pragma once
#include <iostream>
#include <memory>
class Foo {
public:
Foo() {
std::cout << " Foo : " << this << std::endl; }
~Foo() {
std::cout << "~Foo : " << this << std::endl; }
static void* operator new(size_t size);
static void operator delete(void* phead, size_t size);
static void* operator new[](size_t size);
static void operator delete[](void* pheda, size_t size);
private:
char _char1 = 170; // 0xAA
int _int1 = 2864434397; // 0XAABBCCDD
};
// operator new
void* Foo::operator new(size_t size)
{
void* ret = ::operator new(size);;
std::cout << "new, pointer : " << ret << ", size : " << size << std::endl;
return ret;
}
// operator delete
void Foo::operator delete(void* phead, size_t size)
{
std::cout << "delete, pointer : " << phead << ", size : " << size << std::endl;
free(phead);
}
// operator new[]
void* Foo::operator new[](size_t size)
{
void* ret = ::operator new[](size);
std::cout << "new [], pointer : " << ret << ", size : " << size << std::endl;
return ret;
}
// operator delete[]
void Foo::operator delete[](void* phead, size_t size)
{
std::cout << "delete [], pointer : " << phead << ", size : " << size << std::endl;
free(phead);
void test()
{
Foo* p1 = new Foo[2];
delete p1; // 异常退出
//delete [] p1;
Foo* p2 = new Foo;
delete[] p2; // 一直调用析构函数无数遍
//delete p2;
}
边栏推荐
- How to manage fixed assets efficiently in one stop?
- Shell脚本-if else语句
- MapReduce编程基础
- Shell脚本-变量的定义、赋值和删除
- Nacos service configuration and persistence configuration
- Mise en œuvre simple de l'équilibrage de la charge par nacos
- Differences among tasks, threads and processes
- [ESP nanny level tutorial preview] crazy node JS server - Case: esp8266 + DHT11 +nodejs local service + MySQL database
- [pytorch learning] torch device
- [ESP nanny level tutorial] crazy completion chapter - Case: ws2812 light control system based on Alibaba cloud, applet and Arduino
猜你喜欢

FAQ | FAQ for building applications for large screen devices

樹結構---二叉樹2非遞歸遍曆

Installing Oracle EE

3D printing Arduino four axis aircraft

Pain points and solutions of equipment management in large factories

jeecg 重启报40001

猿人学第20题(题目会不定时更新)

Tree structure -- binary tree 2 non recursive traversal

How to launch circle of friends marketing and wechat group activities

2.3 【kaggle数据集 - dog breed 举例】数据预处理、重写Dataset、DataLoader读取数据
随机推荐
树结构---二叉树2非递归遍历
Shell脚本-case in 和正则表达式
樹結構---二叉樹2非遞歸遍曆
2.3 [kaggle dataset - dog feed example] data preprocessing, rewriting dataset, dataloader reading data
Meituan machine test in 2022
【pytorch学习】torch.device
Key points of NFT supervision and overseas policies
Flink面试题
In the middle of the year, where should fixed asset management go?
Shell script -for loop and for int loop
How to manage fixed assets well? Easy to point and move to provide intelligent solutions
序列化、监听、自定义注解
如何高效拉齐团队认知
Phishing identification app
Shell脚本-while循环详解
Shell script - array definition and getting array elements
【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于阿里云和Arduino的化学环境系统检测,支持钉钉机器人告警
钓鱼识别app
易点易动助力企业设备高效管理,提升设备利用率
Shell脚本-if else语句