内存对于程序员来说,是一个必须要考虑的问题,单片机编程,应用编程,都是需要考虑内存的分配、释放。
栈、堆的简单说明;
栈:在函数内部声明的所有变量都将占用栈内存。
堆:在程序运行时可用于动态分配内存。
在C++提供了两个关键字new和delete,进行内存动态申请和释放。
new:在程序运行中奉陪堆内的内存,并返回所分配的空间地址。
用法:new为任意的数据类型分配动态内存,其中:new type。(type:可以内置的数据类型,例如:数组、类)。
例子:定义一个变量rice整形指针,为了防止内存空间不足,无法分配内存,所以加以判断内存申请是否返回NULL。
#include <iostream>
using namespace std;
int main()
{
int *rice = NULL;
if(!(rice = new int))
{
cout << "out of memory" << endl;
}
cout << rice << endl;
return 0;
}
注:在C语言中申请内存使用malloc(),在C++也拥有malloc()来申请内存。但是C++中一般不适用malloc,而是使用new。new不只是分配内存,还可以创建对象。
delete:当不在占用动态内存时,通过delete动态释放内存。
用法:delete为任意的数据类型分配的内存释放,其中:delete val。(释放val所指向的内存)。
例子:在上一个例子中,将申请的内存,使用完释放掉。
#include <iostream>
using namespace std;
int main()
{
int *rice = NULL;
if(!(rice = new int))
{
cout << "out of memory" << endl;
}
cout << rice << endl;
delete rice;
return 0;
}
对象的动态内存的分配:根据具体类,通过new关键字,定义一个实体(对象)。(作为程序员有个人生大难题,没对象,地中海,大肚子。但是我们可以为自己创建对象,空虚的时候new一个)
例子:定义一个rice类,类内定义构造方法和析构方法,当通过new定义实体时,会调用类的构造方法,当通过delete释放实体内存时,会调用类的析构方法。
#include <iostream>
using namespace std;
class rice
{
public:
rice() {
cout << "rice 构造函数" <<endl;
}
~rice() {
cout << "rice 析构函数" <<endl;
}
};
int main( )
{
rice *my_rice= new rice;
delete my_rice;
return 0;
}
注: 构造函数:
1.构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。
2.构造函数名字与类名相同,无返回类型。
3.可以由用户自己定义实现,根据需要设计对数据成员进行初始化,依旧可以设置函数的默认参数。
4.如果我们没有定义构造函数,系统会为我们自动定义一个无参的默认构造函数的,它不对成员属性做任何操作,如果我们自己定义了构造函数,系统就不会为我们创建默认构造函数了。
析构函数:
1.析构函数没有返回值,没有参数;
2.没有参数,所以不能重载,一个类仅有一个析构函数;
3.析构函数除了释放工作,还可以做一些用户希望它做的一些工作,比如输出一些信息。
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!