分享

c++动态内存分配

 行者花雕 2021-04-28

  下面随笔是关于c++动态内存分配。

动态申请内存操作符 new

  • new 类型名T(初始化参数列表)

  • 功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。

  • 结果值:成功:T类型的指针,指向新分配的内存;失败:抛出异常。

释放内存操作符delete

  • delete 指针p

  • 功能:释放指针p所指向的内存。p必须是new操作的返回值。

 1 //例1 动态创建对象举例
 2 
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 class Point {
 8 
 9 public:
10 
11 Point() : x(0), y(0) {
12 
13   cout<<"Default Constructor called."<<endl;
14 
15 }
16 
17 Point(int x, int y) : x(x), y(y) {
18 
19   cout<< "Constructor called."<<endl;
20 
21 }
22 
23 ~Point() { cout<<"Destructor called."<<endl; }
24 
25   int getX() const { return x; }
26 
27   int getY() const { return y; }
28 
29   void move(int newX, int newY) {
30 
31     x = newX;
32 
33     y = newY;
34 
35 }
36 
37 private:
38 
39 int x, y;
40 
41 };
42 
43 int main() {
44 
45   cout << "Step one: " << endl;
46 
47   Point *ptr1 = new Point; //调用默认构造函数
48 
49   delete ptr1; //删除对象,自动调用析构函数
50 
51   cout << "Step two: " << endl;
52 
53   ptr1 = new Point(1,2);
54 
55   delete ptr1;
56 
57   return 0;
58 
59 }
 1 运行结果:
 2 
 3 Step One:
 4 
 5 Default Constructor called.
 6 
 7 Destructor called.
 8 
 9 Step Two:
10 
11 Constructor called.
12 
13 Destructor called.

分配和释放动态数组

    • 分配:new 类型名T [ 数组长度 ]

      • 数组长度可以是任何表达式,在运行时计算

    • 释放:delete[] 数组名p

      • 释放指针p所指向的数组。
        p必须是用new分配得到的数组首地址。

 1 //例2 动态创建对象数组举例
 2 
 3 #include<iostream>
 4 
 5 using namespace std;
 6 
 7 class Point { //类的声明同例6-16,略 };
 8 
 9 int main() {
10 
11   Point *ptr = new Point[2]; //创建对象数组
12 
13   ptr[0].move(5, 10); //通过指针访问数组元素的成员
14 
15   ptr[1].move(15, 20); //通过指针访问数组元素的成员
16 
17   cout << "Deleting..." << endl;
18 
19   delete[] ptr; //删除整个对象数组
20   
21   return 0;
22 
23 }
 1 运行结果:
 2 
 3 Default Constructor called.
 4 
 5 Default Constructor called.
 6 
 7 Deleting...
 8 
 9 Destructor called.
10 
11 Destructor called.

动态创建多维数组

new 类型名T[1维长度][2维长度]…

  • 如果内存申请成功,new运算返回一个指向新分配内存首地址的指针。

  例如

  char (*fp)[3];

  fp = new char[2][3];

 1 //例3 动态创建多维数组
 2 
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 int main() {
 8 
 9   int (*cp)[9][8] = new int[7][9][8];
10 
11   for (int i = 0; i < 7; i++)
12 
13     for (int j = 0; j < 9; j++)
14 
15       for (int k = 0; k < 8; k++)
16 
17         *(*(*(cp + i) + j) + k) =(i * 100 + j * 10 + k);
18 
19   for (int i = 0; i < 7; i++) {
20 
21     for (int j = 0; j < 9; j++) {
22 
23       for (int k = 0; k < 8; k++)
24 
25         cout << cp[i][j][k] << " ";
26 
27         cout << endl;
28 
29     }
30 
31     cout << endl;
32 
33   }
34 
35   delete[] cp;
36 
37   return 0;
38 
39 }

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多