c++内存管理-侯捷网课知识总结

c++应用程序内存分配的四个层面:

侯捷老师总结:
在这里插入图片描述
正如图中所示:对于封装好的c++应用程序,内存分配通常包括四层:

  1. c++标准库里面的std::allocator,
  2. c++原始代码原语:new, new[], new(), ::operator new(), delete…
  3. c语言中的malloc 和free
  4. OS API
    正如图中所示,这四层是逐渐靠近底层。封装性逐渐降低。

四层代码的实现:

void *p1 = malloc(512);
free(p1);
 
complex<int>* p2 = new complex<int>;
delete p2;
 
void *p3 = ::operator new(512);
::operator delete(p3);
//此处第四种只举一例,经博主亲测可以运行在codeblock上
int *p4=allocator<int>().allocate(5);
allocator<int >().deallocate(p4,5);

在这里插入图片描述

new的底层实现过程:

对于compelx *p_complex=new complex(1,2);
实现步骤如下:

  1. 系统会调用operator new(size_t size)进行内存分配,并将分配的空间的首地址(void*)返回
    1.1operator new的底层实现是首先定义一个void*p指针,
    1.2while((p=malloc(size))==0)进行判断,如果内存分配失败(也就是内存不够用,实际上我们很难遇到),就会进入一个try,先调用一次set_new_handler()函数,然后对其进行抛出异常。
    1.3循环1.2
    (这里指的强调的是,typedef void (*new_handler)();new_handler set_new_handler(new_handler p)是由客户自己编写,一般使用来释放无用内存,从而保证p指针的malloc成功)附一张博主测试的代码和结果图
#include<iostream>
using namespace std;
void noMoreMemory()
{
    cout<<"no memory"<<endl;

}
int main()
{
    set_new_handler(noMoreMemory);

    int *p=new int[10000000000000000];
    return 0;
}

代码示意图
可见底层代码就是循环调用set_new_handler;
3. 进行指针强转,转换成客户的预期类型(本例中就是complex*)
4. 再执行类内部的构造函数

侯捷老师总结的代码pdf:
侯捷老师的总结

//手动重载测试:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
class A
{
public:
	A();
	virtual ~A();

	virtual void sol()
	{
		cout << "A::sol" << endl;
	}

private:

};

A::A()
{
}

A::~A()
{
	cout << "~a" << endl;
}
class B:public A
{
public:
	int  a ;
	int b;
	B();
	~B();
	virtual void sol()
	{
		cout << "B::sol" << endl;
	}
	void sol2()
	{
		cout << "B::so2"<< b << endl;
	}
	 void* operator new(size_t size)
	{
		 cout << "my operator new" << endl;
		 B *p = (B*)malloc(size);
		 return p;
	}
	 void operator delete(void * phead, size_t size) {
		 cout << "my operator delete" << endl;
		 free(phead);
	 }
	 void* operator new[](size_t  size) {
		 cout << "my operator new[]" << endl;
		 B *p = (B*)malloc(size);
		 return p;
	 }
		 void operator delete[](void * phead, size_t size) {
		 cout << "my operator delete[]" << endl;
		 free(phead);
	 }
private:

};

B::B()
{
	a = 1;
	b = 2;
}

B::~B()
{
	cout << "~B" << endl;
}
int main()
{
	A *p = new B;
	delete p;

	A *arr = new A[10];
	delete [] arr;
	system("pause");
	return 0;
}

零碎:

以下三种有默认函数:

  1. 拷贝构造函数
  2. 拷贝赋值函数
  3. 析构函数
  4. 构造函数
  5. 移动构造函数(C++2.0)
  6. 移动赋值函数 (C++2.0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值