当前位置:网站首页>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;
}
原网站

版权声明
本文为[代码整洁之道]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45373355/article/details/124918742