4.C++:内存管理

一、匿名对象

int main()
{
    Solution s1;//s1的声明周期在main函数中
    s1.Sum_Solutino(10);
    
    //Solution();匿名对象,声明周期就在这一行,之后执行析构函数
    Solution().Sum_Solutino(10);//只有这一行会使用这个创建对象,别人不需要使用
    return 0;
}

二、. C/C++内存分布

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
 static int staticVar = 1;
 int localVar = 1;
 
 int num1[10] = {1, 2, 3, 4};
 char char2[] = "abcd";
 char* pChar3 = "abcd";  //pChar3存的是"abcd"字符串的地址
 int* ptr1 = (int*)malloc(sizeof (int)*4);
 int* ptr2 = (int*)calloc(4, sizeof(int));
 int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);
 free (ptr1);
 free (ptr3);
}
1. 选择题:
选项: A. B. C.数据段 D.代码段
globalVar 在哪里? __C__ staticGlobalVar 在哪里? __C__
staticVar 在哪里? __C__ localVar 在哪里? ___A_
num1 在哪里? ___A_
char2 在哪里? __A__ * char2 在哪里? __A_
pChar3 在哪里? ___A_ * pChar3 在哪里? ___D_
ptr1 在哪里? __A__ * ptr1 在哪里? __B__
2. 填空题:
sizeof ( num1 ) = ___40_ ;
sizeof ( char2 ) = ___5_ ; strlen ( char2 ) = __4__ ; //从元素首地址开始,遇到‘\0’结束
sizeof ( pChar3 ) = __4/8__ ; strlen ( pChar3 ) = __4__ ; //从元素首地址开始,遇到‘\0’结束
sizeof ( ptr1 ) = __4/8__ ;

 


三、内存管理方式 

3.1C语言中动态内存管理方式

void Test ()
{
 int* p1 = (int*) malloc(sizeof(int));
 free(p1);
 // 1.malloc/calloc/realloc的区别是什么?
 int* p2 = (int*)calloc(4, sizeof (int));
 int* p3 = (int*)realloc(p2, sizeof(int)*10);
}

3.2C++内存管理方式

int main()
{
    //C 函数
    int* p1 = (int*)malloc(sizeof(int));
    int* p3 = (int*)malloc(sizeof(int)*10);
    free(p1);
    free(p3);
    //C++ 操作符
    int* p2 = new int;
    int* p4 = new int[10]; //申请10个int的40个字节空间
    int* p5 = new int(10);//申请一个int4个字节空间,初始化为10
    delete p2;
    delete[] p4;
    return 0;
}

3.3 new和delete

既然有了malloc和free,new和delete的意义何在?

1.对于内置类型,效果一样;

2.对于自定义类型,效果不一样。 

class A
{
public:
	A()
	{
		_a = 0;
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};
int main()
{
	int* p1 = new int;
	int* p2 = (int*)malloc(sizeof(int));
	A* p3 = new A;  //申请空间+构造函数初始化
	A* p4 = (A*)malloc(sizeof(A)); //申请空间
    delete p3;  //析构函数+释放空间
    free(p4); //释放空间
	return 0;
}

四、operator new和operator delete

int main()
{
	A* p2 = new A;
	A* p1 = (A*)malloc(sizeof(A));
	A* p3 = (A*)operator new(sizeof(A));
	//operator new和malloc的区别是什么?
	//结论:使用方式一样,处理错误方式不一样
	size_t size = 2;
	void* p4 = malloc(size*1024*1024*1024);
	cout << p4 << endl; //失败返回0
	try
	{
		void* p5 = malloc(size * 1024 * 1024 * 1024);
		cout << p5 << endl; //失败抛异常(面向对象处理错误的方式)
	}
	catch (exception& e)
	{
		cout << e.what() << endl; 
	}
	return 0;
}

总结 :

//malloc
//operator new ==>malloc+失败抛异常实现

//new ==>operator new+构造函数

new 比起malloc不一样的地方:1、调用构造函数初始化 2、失败了抛异常

delete 比起free不一样的地方:1、调用析构函数清理

operator delete 和free没有区别


五、newdelete的实现原理 

5.1 内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

5.2 自定义类型

new的原理
1. 调用operator new函数申请空间
2. 在申请的空间上执行构造函数,完成对象的构造
delete的原理
1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用operator delete函数释放对象的空间
new T[N]的原理
1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申
2. 在申请的空间上执行N次构造函数
delete[]的原理
1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<--- Last few GCs ---> [11584:0000020B71203B50] 69329 ms: Scavenge (reduce) 2037.9 (2050.3) -> 2037.3 (2051.3) MB, 6.3 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure [11584:0000020B71203B50] 69339 ms: Scavenge (reduce) 2038.2 (2053.3) -> 2037.6 (2053.3) MB, 3.2 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure [11584:0000020B71203B50] 69348 ms: Scavenge (reduce) 2038.3 (2050.5) -> 2038.1 (2052.0) MB, 3.3 / 0.0 ms (average mu = 0.348, current mu = 0.419) allocation failure 12: 00007FF6482BAB44 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithFiller+84 13: 00007FF6482BAE43 v8::internal::FactoryBase<v8::internal::Factory>::NewFixedArrayWithMap+35 14: 00007FF6480C8A10 v8::internal::HashTable<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::EnsureCapacity<v8::internal::Isolate>+208 15: 00007FF6480C6086 v8::internal::Dictionary<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::Add<v8::internal::Isolate>+102 16: 00007FF6480CF346 v8::internal::BaseNameDictionary<v8::internal::NameDictionary,v8::internal::NameDictionaryShape>::Add+118 17: 00007FF647FC430C v8::internal::Runtime::GetObjectProperty+2204 18: 00007FF64848B50D v8::internal::SetupIsolateDelegate::SetupHeap+463949 19: 00007FF6485017A9 v8::internal::SetupIsolateDelegate::SetupHeap+947945 20: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 21: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 22: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 23: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 24: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 25: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 26: 00007FF648423EF2 v8::internal::SetupIsolateDelegate::SetupHeap+40498 27: 0000028E519B08BF
07-22

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值