#define _CRI_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Test
{
public:
//new可以触发构造函数,且可以为构造函数传参,malloc不能触发构造函数
Test(int a, int b)
{
my_a = a;
my_b = b;
}
//delete可以触发析构函数,free()不可以触发析构函数
//析构函数的作用和delete的作用不能弄混淆,析构函数是把由对象创建出来的存在堆里的空间释放掉,delete的作用是把堆空间的对象释放掉,它们释放的空间是完全不同的
~Test()
{
cout << "~Test()" << endl;
}
private:
int my_a;
int my_b;
};
//c语言中
void test1()
{
//在堆中申请了空间
int *p = (int *)malloc(64);
//delete p;malloc出来的空间时可以用delete释放的
//释放刚刚申请的空间
if (p != NULL)
{
free(p);
p = NULL;//同时需要使指针p指向NULL
}
}
//c++中
void test2()
{
//这里的new本质是运算符,new后面加数据类型,表示在堆中开辟这个数据类型大小的空间
//new与malloc效果相同,都是返回的是地址空间,所以用它们给变量进行赋值,这个变量必须为指针,new与mmalloc本质是完全不同的,malloc是函数,new是运算符
int *p = new int;
//free(p);new出来的空间也可以用free函数释放
//开辟数组,下面一段代码是为指针array开辟一块int[10]大小的堆空间,这里的10是数组长度,并不指数组下标
int *array = new int[10];
//开辟一个int类型大小空间并赋值10
int *array_int = new int(10);
for (int i = 0; i < 10; i++)//i的作用范围只在这个for循环中,循环结束i就被释放
{
array[i] = i;
}
if (p != NULL)
{
delete p;//这是释放一般变量的堆空间
}
if (array != NULL)
{
delete[] array;//这是释放数组的堆空间,一定要加[],delete[] array;
}
//new和malloc申请的堆空间都可以互相被delete和free释放掉,说明new和malloc实现的原理是相似的,但malloc在为类申请堆空间的时候存在很大缺陷
//下面一段代码虽然在堆空间创建了一个对象t1,但是t1只有有参构造函数,它没有办法调用有参构造函数来给对象初始化
Test *t1 = (Test *)malloc(sizeof(Test));
//new运算符就可以合理直接的调用有参构造函数在堆空间创建对象,当类有多个构造函数时,new也可以通过参数直接一一调用,不存在歧义
Test *t2 = new Test(10, 20);
delete t1;//t1是堆空间对象的指针,不是对象,delete释放的是t1所指向的对象,析构函数释放的是t1指向的对象中的指针变量指向的堆空间
delete t2;
}
//堆空间是在程序结束的时候可以被系统自动回收
int main()
{
//new和delete是运算符,并不是函数名,new和delete相当于sizeof,+,-等运算符
//new和delete是在堆空间进行操作,而之前对象的创建是在栈空间
test1();
test2();
return 0;
}
#include<iostream>
using namespace std;
class Test
{
public:
//new可以触发构造函数,且可以为构造函数传参,malloc不能触发构造函数
Test(int a, int b)
{
my_a = a;
my_b = b;
}
//delete可以触发析构函数,free()不可以触发析构函数
//析构函数的作用和delete的作用不能弄混淆,析构函数是把由对象创建出来的存在堆里的空间释放掉,delete的作用是把堆空间的对象释放掉,它们释放的空间是完全不同的
~Test()
{
cout << "~Test()" << endl;
}
private:
int my_a;
int my_b;
};
//c语言中
void test1()
{
//在堆中申请了空间
int *p = (int *)malloc(64);
//delete p;malloc出来的空间时可以用delete释放的
//释放刚刚申请的空间
if (p != NULL)
{
free(p);
p = NULL;//同时需要使指针p指向NULL
}
}
//c++中
void test2()
{
//这里的new本质是运算符,new后面加数据类型,表示在堆中开辟这个数据类型大小的空间
//new与malloc效果相同,都是返回的是地址空间,所以用它们给变量进行赋值,这个变量必须为指针,new与mmalloc本质是完全不同的,malloc是函数,new是运算符
int *p = new int;
//free(p);new出来的空间也可以用free函数释放
//开辟数组,下面一段代码是为指针array开辟一块int[10]大小的堆空间,这里的10是数组长度,并不指数组下标
int *array = new int[10];
//开辟一个int类型大小空间并赋值10
int *array_int = new int(10);
for (int i = 0; i < 10; i++)//i的作用范围只在这个for循环中,循环结束i就被释放
{
array[i] = i;
}
if (p != NULL)
{
delete p;//这是释放一般变量的堆空间
}
if (array != NULL)
{
delete[] array;//这是释放数组的堆空间,一定要加[],delete[] array;
}
//new和malloc申请的堆空间都可以互相被delete和free释放掉,说明new和malloc实现的原理是相似的,但malloc在为类申请堆空间的时候存在很大缺陷
//下面一段代码虽然在堆空间创建了一个对象t1,但是t1只有有参构造函数,它没有办法调用有参构造函数来给对象初始化
Test *t1 = (Test *)malloc(sizeof(Test));
//new运算符就可以合理直接的调用有参构造函数在堆空间创建对象,当类有多个构造函数时,new也可以通过参数直接一一调用,不存在歧义
Test *t2 = new Test(10, 20);
delete t1;//t1是堆空间对象的指针,不是对象,delete释放的是t1所指向的对象,析构函数释放的是t1指向的对象中的指针变量指向的堆空间
delete t2;
}
//堆空间是在程序结束的时候可以被系统自动回收
int main()
{
//new和delete是运算符,并不是函数名,new和delete相当于sizeof,+,-等运算符
//new和delete是在堆空间进行操作,而之前对象的创建是在栈空间
test1();
test2();
return 0;
}