目录


注意:我们编写的代码是存在于计算机文件当中的,计算机文件属于硬盘而不属于内存,所以代码并不属于以上的内存划分




我们对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类似。