c++动态内存分配

  下面随笔是关于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)

相关推荐

  • (8条消息) C++ 智能指针 unique

    unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针.unique_ptr对象包装一个原始指针,并负责其生命周期.当该对象被销毁时, ...

  • C++析构函数详解

    首页 >编程笔记 >C++笔记阅读:42,689C++析构函数详解C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学:一对一辅导 + 一 ...

  • C++内存管理之shared

     ----------------------------------------shared_ptr--------------------------------------- 引子 c++中动态 ...

  • C/C++知识教程:指针

    一.指针的概念 指针是一种数据类型,被称为"指针类型".指针类型描述的是一个地址,这个地址指向内存中另外一个对象的位置.简单的说,指针表示的是它所指向对象的地址.这些地址包括变量, ...

  • 【C/C 】继承

    概述 继承与派生是同一过程从不同的角度看 保持已有类的特性而构造新类的过程称为继承 在已有类的基础上新增自己的特性而产生新类的过程称为派生 被继承的已有类称为基类(父类) 派生出的新类称为派生类(子类 ...

  • C 11中智能指针的原理、使用、实现

    目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的 ...

  • 现代C一文读懂智能指针

    https://m.toutiao.com/is/JHS4MVf/ 智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr<T> :独占资源所有权的指针. st ...

  • 动态内存分配连续内存空间的二维数组

    可以直接使用一维数组来模拟二维数组,下面的代码就是在此基础上,用一个二级指针指向一维数组的相应地方,详见代码 #include <stdio.h> #include <malloc. ...

  • 【链表3】动态内存分配

    文/Edward 这一小节是为了讲述第2小节链表而做的只是铺垫.在9.2节中,我们通过一种非常朴素的方式来为大家展示了"链式"数据结构的基本方法,即,我们先定义好一个结构体存储类型 ...

  • C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

    C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

  • C和指针之动态内存分配之编程练习4

    C和指针之动态内存分配之编程练习4

  • 一文读懂 Linux 内存分配全过程

    在<你真的理解内存分配>一文中,我们介绍了 malloc 申请内存的原理,但其在内核怎么实现的呢?所以,本文主要分析在 Linux 内核中对堆内存分配的实现过程. 本文使用 Linux 2 ...

  • 解读各种内存分配函数的差别

    今天我们来讲讲几种容易混淆的内存分配函数的区别,它们分别是:SHGetMalloc, SHAlloc, CoGetMalloc, 和CoTaskMemAlloc. 让我们先从简单的开始吧. 首先,Co ...

  • 程序编译后运行时的内存分配

    一.编译时与运行时的内存情况 1.编译时不分配内存 编译时是不分配内存的.此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确.所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误 ...

  • 创业公司的动态股权分配机制part1

    每天一本书day284 创业公司的动态股权分配机制part1 这是一本好书,纯干货的工具书,带给我很多思考,需要带着理解能力去阅读,但如果能有生活的话理解将会事半功倍.目前也有的地方不理解,但是可以为 ...

  • 创业公司的动态股权分配机制part2

    每天一本书day285 创业公司的动态股权分配机制part2 今天的阅读又开始打起了瞌睡,看的是似懂非懂,因为超出了我的认知范围.越看越看不懂,看来动态股权分配机制是一个复杂的机制,但是掌握了相信一定 ...