目录
内存区域划分
例题:
malloc,calloc和realloc的区别
new和delete
申请空间并初始化
申请多个空间:
new和delete对于自定义类型的处理:
new和delete一定要匹配
new和malloc以及delete和free的区别
抛异常的使用方法:
new的底层
注意:我们编写的代码是存在于计算机文件当中的,计算机文件属于硬盘而不属于内存,所以代码并不属于以上的内存划分
我们对char2和*char2以及pChar3和*pChar3进行理解:
char2的字符串是经过静态区的"abcd"进行拷贝拷贝到栈上去。
pChar3因为被const修饰,所以对应的字符串在常量区,pChar3指向该区域。
char2和pChar3都是在栈上创建的指针,属于栈。
*char2表示数组首元素,也就是'a'
*pChar3表示指向常量区的常量字符串"abcd"的地址。
malloc表示申请空间,calloc表示申请空间并且初始化,而realloc表示扩容或缩容。
这里不需要对ptr2进行释放:
答:在使用realloc时,会分为原地扩容或异地扩容,原地扩容之后ptr3就是原来的ptr2,异地扩容时,realloc函数还会将ptr2指向的空间进行释放。
new和delete类比c语言的malloc和free,起到申请空间和释放空间的作用。
int main()
{
int*p = new int;
delete p;
}
申请一个整型的空间,p指针指向该空间。
delete表示释放该空间。
我们在new的时候,并不会对该空间进行初始化。
int main()
{
int*p = new int(0);
delete p;
return 0;
}
表示申请空间并把该空间对应的值初始化为0.
int*p1 = new int[10];
delete[] p1;
申请多个空间并且初始化:
int*p1 = new int[10]{1, 2, 3, 4};
delete[] p1;
new和delete对于内置类型的处理,和malloc,free没有什么区别。
class A
{
public:
A(int a = 0)
:_a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
class A
{
public:
A(int a = 0)
:_a(a)
{
cout << "A()" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
int main()
{
/*int*p = new int(0);
delete p;*/
/*int* p1 = new int[10]{1,2,3,4,5,6,7,8,9,10};
delete[] p1;*/
A*p1 = new A;
delete p1;
return 0;
}
对于自定义类型,new可以调用其默认构造,delete可以调用其默认析构。
错配可能产生我问题。
int main()
{
while (1)
{
int*p1 = (int*)malloc(1024);
if (p1)
{
cout << p1 << endl;
}
else
{
cout << "申请失败" << endl;
break;
}
}
}
malloc不断的申请内存,最终会申请失败,申请成功时返回该指针,申请失败时返回空指针。
当我们使用new来进行替代时:
int main()
{
while (1)
{
int*p1 = new int[102400];
if (p1)
{
cout << p1 << endl;
}
else
{
cout << "申请失败" << endl;
break;
}
}
}
我们发现:new成功时返回该指针,new失败时不返回空指针。
总结:malloc申请成功,返回该指针,申请失败,返回空指针。
new申请成功,返回该指针,申请失败,抛异常。
int main()
{
try{
while (1)
{
int*p1 = new int[102400];
if (p1)
{
cout << p1 << endl;
}
else
{
cout << "申请失败" << endl;
break;
}
}
}
catch (exception& e)
{
cout << e.what() << endl;
}
return 0;
}
void test()
{
while (1)
{
int*p1 = new int[102400];
if (p1)
{
cout << p1 << endl;
}
else
{
cout << "申请失败" << endl;
break;
}
}
}
int main()
{
try{
test();
}
catch (exception& e)
{
cout << e.what() << endl;
}
}
申请失败是自动去抛异常。
注意:并不是运算符重载,因为没有自定义类型的参数。
new就相当于是malloc的封装,不同点在于申请内存失败时抛异常。
对于operator new的使用:
#include
using namespace std;
void test()
{
while (1)
{
int*p1 = (int*)operator new(102400);
if (p1)
{
cout << p1 << endl;
}
else
{
cout << "申请失败" << endl;
break;
}
}
}
int main()
{
try{
test();
}
catch (exception& e)
{
cout << e.what() << endl;
}
}
operator new的使用方法和malloc类似。