c语言内存分配与释放(c++内存释放原则)

分析内存分配和释放

#include <iostream>

using namespace std;

//c++ 内存分配与释放本质
//通过反汇编得知
//new本质上是一个函数,最终通过malloc进行分配内存
//delete也是一个函数,最终通过free进行释放内存

int main(int argc, char *argv[])
{
	int *p1 = new int(5);
	int *p2 = new int[10]{ 0, 1,2,3,4,5,6,7,8,9 };

	delete p1;
	delete[] p2;
	cin.get();
	return 0;
}

通过反汇编,最终看到new函数

c语言内存分配与释放(c++内存释放原则)

通过反汇编的方式,看到new和delete都是函数,分别使用malloc分配内存和free释放内存

由于我使用的是Visual Studio 2017 社区版,vcruntime文件路径可能不太一样.

具体路径如下:

C:Program Files (x86)Microsoft Visual Studio2017CommunityVCToolsMSVC14.13.26128crtsrcvcruntime

可以通过查看new_scalar.cpp (new) 和 delete_scalar.cpp(delete)文件.可以先看一下具体源码:

//new  VCRuntime的实现
_CRT_SECURITYCRITICAL_ATTRIBUTE
void* __CRTDECL operator new(size_t const size)
{
    for (;;)
    {
        if (void* const block = malloc(size))  //使用malloc分配
        {
            return block;
        }

        if (_callnewh(size) == 0)
        {
            if (size == SIZE_MAX)
            {
                __scrt_throw_std_bad_array_new_length();
            }
            else
            {
                __scrt_throw_std_bad_alloc();
            }
        }

        // The new handler was successful; try to allocate again...
    }
}

//delete  VCRuntime的实现
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);   //使用free
    #endif
}

通过重载new/delete,查看内存分配和释放顺序

#include <iostream>

using namespace std;

class Person
{
public:
	Person()
	{
		cout << "构造函数" << endl;
	}

	~Person()
	{
		cout << "析构函数" << endl;
	}
	static void* operator new (size_t size)
	{
		cout << "局部 new " << endl;
		Person *p = ::new Person;      //引用全局的new,这里还是会调用一次构造函数
		return p;
	}
	static void operator delete(void* p)
	{
		cout << "局部 delete " << endl;
		::delete p;
	}
};

////全局重载new和delete
void* operator new(size_t size)
{
	cout << "全局重载 new调用" << endl;
	void* p = malloc(size);
	return p;
}
void* operator new[](size_t size)
{
	cout << "全局重载 new[]调用" << endl;
	return operator new (size);
}

void operator delete(void* p)
{
	cout << "全局重载 delete调用" << endl;
	free(p);
}
void operator delete[](void* p)
{
	cout << "全局重载 delete[]调用" << endl;
	free(p);
}

//局部重载new和delete,实现单例模式,避免反复在堆上分配和多次释放异常

//内存分配与释放顺序,可以对比下图
//new->::new->malloc->构造函数
//析构函数->delete->::delete->free

//new 无论是局部还是全局重载,都会调用构造函数

int main(int argc, char *argv[])
{
	Person *p1 = new Person;

	delete p1;

	cin.get();

	return 0;
}

c语言内存分配与释放(c++内存释放原则)

c++内存分配与释放顺序

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论