【C++干货基地】深度理解C++中的高效内存管理方式 new & delete

15 篇文章 67 订阅
订阅专栏

在这里插入图片描述

🎬 鸽芷咕个人主页

 🔥 个人专栏: 《C++干货基地》 《粉丝福利》

⛺️生活的理想,就是为了理想的生活!

引入

  哈喽各位铁汁们好啊,我是博主鸽芷咕《C++干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的城市有没有这种实惠又全面的零食基地呢?C++ 本身作为一门篇底层的一种语言,世面的免费课程大多都没有教明白。所以本篇专栏的内容全是干货让大家从底层了解C++,把更多的知识由抽象到简单通俗易懂。

⛳️ 推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点 击跳转到网站。

文章目录

  • 引入
  • ⛳️ 推荐
  • 一、C/C++内存分布
    • 1.1 内存布局图:
    • 1.2 C/C++程序内存分配的几个区域:
  • 二、C语言的内存管理方法
  • 三、C/C++ 中的内存管理方法
    • 3.1 new 和 delete 的使用
    • 3.2 new 和 delete 在创建自定义类型时候的动作
  • 四、new和delete的实现原理
    • 4.1 operator new与函数
    • 4.3 使用new 和new[ ] 是如何获取大小的
    • 4.4 delete 和 delete[ ] 的区别
  • 五、 malloc/free和new/delete的区别

一、C/C++内存分布

1.1 内存布局图:

在这里插入图片描述
用通俗易懂的话来描述就是:

  1. 栈区(stack):存放的是我们平常创建的变量 形参 等 临时变量!
  2. 堆区(heap):目前我们学的动态内存分配 都是在堆区开辟的!
  3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
  4. 代码段可执行代码 和 只读 常量

1.2 C/C++程序内存分配的几个区域:

  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分
    配方式类似于链表。
  3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体(类成员函数和全局函数)的二进制代码。

二、C语言的内存管理方法

在C 语言中 我们通常都是使用 malloc 来申请空间,使用 free 来释放空间

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);
	
	free(p3);
}

但是malloc 还有 realloc 开辟空间都有失败的风向因此再项目中如果有开辟空间的行为是我们还得专门去写一个判断语句来避免空间开辟失败的其他报错。

void Test()
{

	int* tmp = (int*)malloc(sizeof(int));
	if (tmp == NULL)
	{
		perror("malloc file");
		exit(-1);
	}

	int* p1 = tmp;

	free(p1);
}

三、C/C++ 中的内存管理方法

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

  • 在使用C语言的内存管理方式是不能进行自己去创建类对象的
  • 而这也是我们设计 new 和 delete 的原因,更方便的开辟空间

3.1 new 和 delete 的使用

int main()
{
	// 1、用法上,变简洁了
	int* p0 = (int*)malloc(sizeof(int));
	int* p1 = new int;
	int* p2 = new int[10]; // new 10个int对象

	// 2、可以控制初始化
	int* p3 = new int(10); // new 1个int对象,初始化成10
	int* p4 = new int[10]{ 1,2,3,4,5 };
	
	return 0;
}

以上就是new 和 delete 的简单使用方法相信大家看一眼就会了非常的简单好上手。

3.2 new 和 delete 在创建自定义类型时候的动作


struct ListNode
{
	ListNode* _next;
	int _val;

	ListNode(int val)
		:_next(nullptr)
		, _val(val)
	{}
};

struct ListNode* CreateListNode(int val)
{
	struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}

	newnode->_next = NULL;
	newnode->_val = val;
	return newnode;
}

以上是我们在C语言中开辟链表的方式,申请空间时书写非常麻烦还要去检查一下开辟空间是否失败。

  • 而new是可以直接去给我们生成空间和自动调用构造函数初始化的

struct ListNode
{
	ListNode* _next;
	int _val;

	ListNode(int val)
		:_next(nullptr)
		, _val(val)
	{}
};

int main()
{
	// 1、用法上,变简洁了
	int* p0 = (int*)malloc(sizeof(int));
	int* p1 = new int;
	int* p2 = new int[10]; // new 10个int对象

	// 2、可以控制初始化
	int* p3 = new int(10); // new 1个int对象,初始化成10
	int* p4 = new int[10]{ 1,2,3,4,5 };

	// 3、自定义类型,开空间+构造函数
	// 4、new失败了以后抛异常,不需要手动检查
	ListNode* node1 = new ListNode(1);
	ListNode* node2 = new ListNode(2);
	ListNode* node3 = new ListNode(3);
	//...
	return 0;
}

四、new和delete的实现原理

new 关键字的好用我们已经体验过,malloc 和 new相比简直一个天上一个地下,用过new的人都不会再选择malloc 了, 那他的底层究竟是怎么实现的呢?

  • 从下面这段代码我们可以看对内置类型进行new 开辟空间是去调用 operator new 函数来进行开辟空间的。
    在这里插入图片描述

4.1 operator new与函数

  • 那么operator new 函数是怎么实现的呢?
/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间
失败,尝试执行空               间不足应对措施,如果改应对措施用户设置了,则继续申请,否
则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
	// try to allocate size bytes
	void* p;
	while ((p = malloc(size)) == 0)
		if (_callnewh(size) == 0)
		{
			// report no memory
			// 如果申请内存失败了,这里会抛出bad_alloc 类型异常
			static const std::bad_alloc nomem;
			_RAISE(nomem);
		}
	return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void* pUserData)
{
	_CrtMemBlockHeader* pHead;
	RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
	if (pUserData == NULL)
		return;
	_mlock(_HEAP_LOCK);  /* block other threads */
	__TRY
		/* get a pointer to memory block header */
		pHead = pHdr(pUserData);
	/* verify block type */
	_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
	_free_dbg(pUserData, pHead->nBlockUse);
	__FINALLY
		_munlock(_HEAP_LOCK);  /* release other threads */
	__END_TRY_FINALLY
		return;
}
/*
free的实现
*/
#define   free(p)               _free_dbg(p, _NORMAL_BLOCK)

从这里我们就可以看到 operator new 实际上用 malloc 来封装实现开辟空间的

  • 也就是说,new 的底层是 调用 operator new 而 operator new 的底层是malloc
  • 那么new的底层实际上是对 malloc 封装实现的。

delete 也是同理在 delete 中我们发现 delete 是通过调用 operator delete 来实现开辟空间的而 operator delete 是通过 _free_dbg 来释放空间,_free_dbg 是free宏的 调用函数。

  • 所以 delete 的底层就是 对 free 进行封装实现的。

4.3 使用new 和new[ ] 是如何获取大小的

这个问题就很简单了,我们编译器其实是可以自动获取类型大小的,我们使用sizeof() 关键字都可以获取大小为什么编译器不可以呢?

  • 所以我们看到了,在汇编代码中一个 push 的大小就是我们要开空间的字节

在这里插入图片描述

  • 而 new[ ] 进行开辟连续的空间时我们就要注意了

本来我申请个连续的空间难道不是40个字节嘛,为什么给我多开辟了4个字节?

在这里插入图片描述

其实多出来的4个字节是为了在调用构造函数的时候记录需要构造的次数,已经析构的时候需要析构多少次。

  • new[10]进行开辟空间时的步骤是这样的
    在这里插入图片描述

4.4 delete 和 delete[ ] 的区别

前面我们看到了 在使用 new[ ] 进行开辟数组空间的时候其实会多开4个字节记录数组个数那么这个数组个数的作用是干嘛呢?

  • 记录数组的作用是为了给我们调用析构函数来用的
  • 大家看一下下面的这段代码,使用 new[ ] 创建的空间不使用 deletet[ ] 释放空间居然不报错。
class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}


private:
	int _a;
};

int main()
{
	A* ptr1 = new A[10];
	delete ptr1;

	return 0;
}

在这里插入图片描述

这是因为我们一旦没有写析构函数的话,new[ ] 就不会多开4个字节。那么我们就行free的时候指针就是在开头的位置不要往前偏移才能释放

  • 而我们一旦写了析构函数new[ ] 就会为我们多开 4个字节存放数量

在这里插入图片描述
在这里插入图片描述

五、 malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

在这里插入图片描述

C++干货铺】内存管理newdelete
qq_55119554的博客
11-06 2409
C&C++内存管理!!!malloc/realloc/calloc/free!!!new/delete!!!
C++核心编程之内存分区模型,巧妙理解内存四区及new关键字的使用
微凉秋意的博客
05-12 1764
🎉生当如鹏起,终当如鲸落🎉 🎉写在前面 从本文开始我就要日常更新C++入门博文啦🎉,从核心编程开始,之前的一些基础我就不再从零整理了,只有函数传参、结构体、指针、数组等稍微难理解的知识在之前的博文写的比较全面;因为竞争确实很大,其他人总结的也很好,要看更详细的基础就看本站的技能树,非常全面;我写博客的初衷一是可以记录自己的学习,加以巩固;二是给更多的人更容易的讲解来快速入门C++,C/C++永不过时!!!此外期待你们的关注,也可以订阅专栏,都是免费的,那么接下来正文开始。 🎉目录 内存...
C++内存布局与数据存储详解
weixin_47987343的博客
05-25 305
理解C++内存布局和数据存储对编写高效、健壮的代码非常重要。正确地管理内存,避免悬挂指针和内存泄漏,是每个C++程序员必须掌握的基本技能。通过理解内存布局,可以更好地进行性能优化和故障排查。
怎样才能让自己的内存高效内存泄漏又如何解决?
aa119101的博客
05-04 509
内存开发人员拥有的最宝贵的资源之一。因此,内存效率是你将要编写的任何程序的核心。当一个程序在运行时尽可能少地使用内存,而仍在执行它的设计任务时,可以说它是内存高效的。 什么是内存泄漏? 当应用程序不再使用对象,但垃圾回收器(GC)无法从工作内存清除对象时,就会发生内存泄漏。这是有问题的,因为这些对象占用的内存本来可以被程序的其他部分使用。随着时间的推移,这种情况会逐渐累积并导致系统性能的下降。 给大家养养眼 Java的垃圾回收 Java的流行在很大程度上归功于它的自动内存管理。GC是一个
C/C++内存管理方式 干货好文助你深度理解
现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things.
01-03 7589
写在前面: 本文旨在向大家完整综合的进行C语言C++内存管理方式,涉及到的内容也会比较全面。在自己梳理回顾的过程也想与大家一起分享。如有 不足之处,欢迎大家指正。 c/c++内存分布 C语言动态内存管理方式:malloc/calloc/realloc和free c++内存管理方式newdelete malloc/free和new/delete的区别 ps:本文主要探究“内存管理方式”...
C++】还new不出对象?看看C++怎么做~(C++内存管理)
Welcome home | Jian Liao 's blog
05-14 1006
本章给大家带来的是C++内存管理new/delete,operator new/operator delete,定位new,关于内存泄漏,一些常见面试题等等)。在C语言阶段,我们经常使用进行内存管理。但是,C语言内存管理存在很多缺陷,会对程序的稳定性和安全性造成影响。不过,C语言内存管理同时也给程序员提供了更大的自由度和灵活性,可以更加精细地控制程序的内存使用。而C++newdelete。🌀C++开发人员提供了灵活的内存管理功能,但同时也带来了内存泄漏、野指针等风险。
c++动态内存管理干货
2302_80221042的博客
05-28 417
事实上,new严格来说是为了解决自定义类型空间的申请像C语言一样用malloc为多个自定义类型申请空间,但是这样会导致一个大问题:我们都知道,类只在创建对象时调用构造函数从而初始化,但是malloc申请时各个对象并不会调用函数处理数据,只是开辟空间而已,导致这10个对象都没有初始化。
C/C++重点解析:内存管理
MaoRuofeng的博客
02-16 990
int main()/* new / delete 和 malloc / free最大区别是 new / delete对于【自定义类型】除了开空间还会调用构造函数和析构函数*/free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;​​​​​​​【注意】在申请自定义类型的空间时,
干货!!c++newdelete工作原理 以及 针对链表节点重载operator new 和operator delete 实现链表节点使用内存池申请和释放空间
现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things.
12-31 8502
第一部分: newdelete的实现原理 开始谈之前我们应该了解另一个概念“operator new”和“operator delete”: new操作符调用一个函数来完毕必需的内存分配,你可以重写或重载这个函数来改变它的行为。new操作符为分配内存所调用函数的名字是operator new()。 函数operator new 通常这样声明: void * operator new(...
C++干货铺】 RAII实现智能指针
qq_55119554的博客
01-24 1589
本篇文章介绍了根据RAII实现的三种智能指针!!!
C++课程设计项目,实现学校职工信息管理系统!完整代码教程及代码解析。
**My Coding Family**
07-08 916
添加职工信息:输入职工姓名、工号、性别、工龄和职称。系统将创建一个新的教师对象并将其添加到职工列表。修改职工信息:输入要修改的职工工号或姓名。系统将查找该职工,并允许修改姓名、性别、工龄和职称。删除职工信息:输入要删除的职工工号或姓名。系统将查找该职工并将其从职工列表删除。查询职工信息:系统将显示所有职工的姓名、工号、性别、工龄和职称。退出系统:退出程序。
【C/C++学习编程】C++new和不用new创建类对象区别
C语言C++学习俱乐部:765860056
10-27 1905
前言:起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计,有时候不使用new的确会带来很多问题。 当然这都是跟new的用法有关的。new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。 一、new创建类对象与不new区别 下面是自己总结的一些关于new创建类对象特..
C++】 —— string的使用
LH__1314的博客
09-16 1481
string类虽然不在STL的容器,但string类十分重要,string类是对字符串的存储和相关操作。
标准C++(二)
m0_63127040的博客
09-18 862
在C语言定义的全局变量、函数、结构、联合、枚举、枚举值、宏都在全局作用域下,所以当项目比较庞大时,非常容易造成命名冲突(以模块名作前缀、后缀),所以C++选择把全局作用域进行拆分成子作用域进行管理,这些子作用域就是作名字空间。把抽象结果(利用面向对象的思维模式,思考、观察出的结果),使用用C++的语法封装出一种类似结构的自定义数据类型(复合数据类型)。使用设计好的类(结构)这种数据类型,定义出的类变量在面向对象编程语言被称为对象(结构变量),创建类对象的行为也被称为实例化对象。int id;
C++_map_set详解
2302_77644537的博客
09-16 1064
set是按照一定次序存储元素的容器在set,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set的元素不能在容器修改(元素总是const),但是可以从容器插入或删除它们。在内部,set的元素总是按照其内部比较对象(类型比较)所指示的特定严格的排序准则(默认是小于)进行排序。set在底层是用二叉搜索树(红黑树)实现的。map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。
TMS Scripter Crack TMS Scripter is a Delphi C++ Builder
q2315702359的博客
09-19 1039
  The integrated development environment or the IDE allows the users in process of creating script jobs during the runtime with the help of multiple cross-language scripts such as de Pascal and the Basics.  It has support for the cross-utilization of the s
C++ 解析 RDP 协议
最新发布
道亦无名
09-22 165
远程桌面协议(Remote Desktop Protocol, RDP)是微软开发的一种网络通信协议,用于提供远程桌面会话服务。它允许用户通过网络连接至远程计算机,并像使用本地计算机一样操作远程系统。本文档将详细探讨在C++环境如何解析RDP协议,涵盖协议层次解析、连接过程管理、数据加密解密、功能数据处理、错误与异常处理以及协议版本适配等方面。
在typescript浏览器端调用C++编写的函数,WebAssembly传递指针类型的参数,以及处理指针类型的返回值。
Xeon_CC的博客
09-17 459
最后是返回一个C++结构体指针,在TypeScript通过DataView来获取内存的地址偏移量来取得结构体的数据,因为em++编译器是以32位来编译.cpp文件的,所以指针占4个字节。DataResult结构体第一个属性dArr是一个指针,那么就是地址偏移量0,然后以32位无符号整型取得dArr指针,通过这个指针去读取wasmmemoryBuffer的数据,就可以得到dArr属性对应的值了。同理,通过地址偏移量+4来得到propCount属性,以32位整数读取数据即可。
写文章

热门文章

  • Blackbox AI : 全新的人工智能编码助手 您的高效AI开发全能助手 53909
  • 生成式人工智能(AIGC):开发者的得力助手还是职业威胁? 48524
  • 【C++干货基地】特殊函数名的函数:赋值运算符重载 42101
  • 机器学习与现代医疗设备的结合:革新医疗健康的未来 39992
  • 阿里云服务器数据库迁云: 数据从传统到云端的安全之旅(WordPress个人博客实战教学) 36016

分类专栏

  • 科技杂谈 8篇
  • 《C++干货基地》 15篇
  • 《docker容器精解篇》 2篇
  • QT开发日志
  • PyTorch 3篇
  • 《数据结构&算法》 21篇
  • 《linux深造日志》 6篇
  • 《C语言进阶篇》 39篇
  • Python知识宝库 9篇
  • python趣味编程
  • Python第三方库
  • 写作技巧&粉丝福利 13篇
  • bug报错解决方案 129篇

最新评论

  • 【Python报错已解决】TypeError: ‘<‘ not supported between instances of ‘str‘ and ‘int‘

    猫头虎: 🌈🐅🔖👨‍🚀 真心推荐这篇博客,每一处都值得细读。猫头虎🐅期待更多更新!🌟

  • 《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》

    TANGLONG_little: 这是一篇高质量的好文,深度理解和清晰的表达方式使复杂的技术概念变得容易理解,值得收藏点赞。博主用心很有耐心,更有对知识的热忱和热爱,写了这么实用有效的分享,期盼博主能够光顾我的博客,给予宝贵的指导

  • 《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》

    倔强的石头_: 博主的文章总是如一泓清泉,让我心旷神怡,每一篇博客都如一本启发书,我从中汲取灵感,你的文章总是让我拓展了视野,增长了见识,感谢你的专业分享。希望博主继续为我们献上这些珍宝。希望你继续为读者奉献智慧的涵泳。

  • 《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》

    白如意i: 通过文章可以看出,博主很有耐心,技术文章不仅是对技术的坚守,更是对知识的热忱和热爱,感谢您的优质分享和坚持更文。期待着博主更加深入的剖析,为大家带来更多的技术好文,同时也希望可以来我博客指导我一番!

  • 《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》

    詩筠: 大佬的文章让我对这领域的技术问题有了更深入的了解,尤其是大佬提到的那些“坑点”,我相信能够在实际应用中避免或解决很多问题。谢谢大佬的分享,期待大佬的更多精彩文章。

最新文章

  • 【Python报错已解决】TypeError: ‘<‘ not supported between instances of ‘str‘ and ‘int‘
  • 【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件
  • 【Pytorch】一文快速教你高效使用torch.no_grad()
2024
09月 130篇
08月 64篇
07月 51篇
06月 13篇
05月 5篇
04月 12篇
03月 5篇
02月 3篇
01月 20篇
2023年89篇

目录

目录

评论 328
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸽芷咕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家赣州公园玻璃钢雕塑销售厂家珠海玻璃钢农耕人物雕塑玻璃钢花盆制作冰淇淋平凉玻璃钢卡通雕塑定制江门定制玻璃钢卡通雕塑深圳欧式玻璃钢雕塑一般多少钱玻璃钢雕塑高难度河北玻璃钢雕塑摆件研发公司合肥玻璃钢雕塑工厂三亚玻璃钢雕塑设计河北卡通玻璃钢雕塑定做淮南人物玻璃钢雕塑商场邮筒美陈郑州门头玻璃钢雕塑玻璃钢泡沫雕塑厂家地址镜面不锈钢玻璃钢仿铜雕塑厂小丑玻璃钢雕塑洛阳抽象玻璃钢卡通雕塑定制玻璃钢和铸铁雕塑大庆动物玻璃钢雕塑生产厂家潍坊人物玻璃钢雕塑定做玻璃钢欧式武士雕塑河北景区玻璃钢雕塑定制玻璃钢造型雕塑品牌佛山南海玻璃钢人物雕塑贵州玻璃钢雕塑的特点梅州玻璃钢公园雕塑沈阳仿铜玻璃钢雕塑佛山银辉玻璃钢雕塑有限公司佛山玻璃钢爱国主题雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化