一、范围for语句:用于遍历一个序列

 int v[]{,,,,};
for(auto &x : v) // 省了拷贝的动作,提高了系统效率
{
cout << x << endl;
}

二、动态内存分配问题

c中,供程序使用的存储空间,有程序区,静态存储区,动态存储区。

C++中,我们把内存进一步分为5个区域;

(1)栈:一般函数内的局部变量都会放在这里,由编译器自动分配和释放;

(2)堆:程序员malloc/new分配,用free/delete来释放。未释放会引起内存泄漏。

(3)全局/静态存储区:放全局变量和静态变量static.程序结束时系统释放。

(4)常亮存储区

(5)程序代码区

堆和栈不同的用途和区别:

(1)栈空间是有限的。这是系统规定的。分配速度快,程序员也控制不了;

(2)堆:只要不超出实际拥有的物理内存,在操作系统允许你能够分配的最大内存大小,都可以分配给你,分配速度比栈慢,你随时可以用malloc/new来分配,free/delete释放,非常灵活。

malloc和free:在C语言中,用malloc和free从堆中分配和释放内存。malloc/free()是函数

一般形式:

void *malloc(int NumBytes); // NumBytes:要分配的字节数。分配成功则返回指向被分配内存的指针,分配失败则返回NULL;当这段内存你不使用的时候,你应该用free()函数来将内存释放掉,供其他地方使用。

free:

void free(void *FirstByte);将之前用malloc分配的内存空间还给程序(操作系统),也就是说释放了这块内存,即这块内存被系统回收,并在需要的时候由系统分配给其他地方使用。

 int *p = nullptr;
p = (int *)malloc(sizeof(int));// 在堆中分配四个字节。
if(p != nullptr)
{
// 内存分配成功
*p = ;
cout << *p << endl;
free(p); // 释放掉内存,千万不要忘记。
}
 char *point = nullptr;
point = (char *)malloc( * sizeof(char));
if(point != nullptr)
{
strcpy_s(point , , “hello world!”)
cout << point << endl;
free(point);
}
 int *p = (int *)malloc(sizeof(int) * );// 分配可以容纳一百个整数的空间
if( p != nullptr)
{
int *q = p;
*q++ = ; // ==>*(q++) --> *q = 1; q++
*q++ = ;
cout << *p << endl;
cout << *(p + ) << endl;
free(p);
}

new和delete

运算符(标识符),C++中用new/delete分配和释放内存,不在使用malloc和free来分配和释放内存。

new/delete也和malloc,free一样,分配和释放内存,同时new/delete还做了更多的事情。

new 一般使用格式

(1)指针变量名 = new 类型标识符;

(2)指针类型名 = new 类型标识符(初始值) // 注意这里是圆括号括起来,表示初始值

(3)指针类型名 = new 类型标识符[内存单元个数]; // 注意这里是[]

 int *myint = new int;
if(myint != nullptr)
{
*myint = ;
cout << *myint << endl;
delete myint; // 释放单个myint的空间
}
 int *myint = new int();
if(myint != nullptr)
{
//*myint = 8;
cout << *myint << endl;
delete myint; // 释放单个myint的空间
}
 int *pa = new int[];  // 开辟一个大小为100的整型数组
if(pa != nullptr)
{
int *q = pa;
*q++ = ; // [0] = 12
*q++ = ; // [1] = 18,执行完,这个q已经指向[2]
cout << *pa << endl;
cout << *(pa + ) << endl;
delete[] pa; // 释放int pa数组空间
} // new时我们用[],那么delete就必须[],[]不写数组大小

额外补充:

(1)配对使用,有malloc 成功必然有free,有new成功必然有delete;

(2)free/delete,不要重复调用。

malloc/free/new/delete区别;

  new创建类对象的时候会自动调用类的构造函数,delete删除类对象的时候会自动调用了类的析构函数。

三、nullptr

C++11中引入的新关键字,nullptr代表的也是空指针。

 //int a = nullptr; // 出错
int b = NULL; // OK
char *p = NULL;
char *a = nullptr;
if(p == nullptr)
{
cout << “NULL == nullptr” << endl;
} if(a == NULL)
{
cout << “a == NULL” << endl;
}

使用nullptr能够避免在整数和指针之间发生混淆。

 cout << typeid(NULL).name() << endl;
cout << typeid(nullptr).name() << endl;

范围for、new内存动态分配、nullptr的更多相关文章

  1. 使用malloc和free函数进行内存动态分配

    一.在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来 ...

  2. 内存动态分配之realloc(),malloc(),calloc()与new运算符

    1,malloc与free是C/C++的标准库函数,new/delete是C++的运算符,是C++面向对象的特征,它们都可用于申请动态内存和释放内存.2,对于非内部数据类型的对象而言,光用maloc/ ...

  3. c语言指针与结构体之内存动态分配

    struct dangdangtest { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }; void main2() { //struct dan ...

  4. c/c++面试39-44之内存动态分配

    39 指针的初始化(二叉树排序),其中引入了双向链表 #include <stdio.h> #include <stdlib.h> struct Tag_Node { stru ...

  5. 堆内存动态分配情况和jvm调优方向

    由上图可以看出: 堆中分为新生代(占堆1/3内存)和老年代(占堆2/3内存), 新生代又分为Eden区(占新生代内存的8/10)和survivor区(占新生代内存的2/10), survivor区又分 ...

  6. C++内存动态分配

    https://www.percona.com/blog/2012/07/05/impact-of-memory-allocators-on-mysql-performance/ https://su ...

  7. c++动态内存管理与智能指针

    目录 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动释放相关联对象的内存 ...

  8. C语言 关于内存动态分配问题

    全局变量:分配到 内存的静态区. 局部变量(非静态):分配到 内存的动态区.在存储区中称为栈(stack) 临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap) 内存动态分配 得 ...

  9. 【转】Java内存管理:深入Java内存区域

    转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...

随机推荐

  1. 44. Wildcard Matching 有简写的字符串匹配

    [抄题]: Given an input string (s) and a pattern (p), implement wildcard pattern matching with support ...

  2. c++ static笔记

    [转]http://www.cnblogs.com/zi-xing/p/4590282.html static的作用 在函数体,一个被声明为static的变量,在这一函数被调用的过程里,其数值维持不变 ...

  3. JSON Web Token(JWT)学习笔记

    1.JWT 的Token 标准的Token由三个部分并以.(点号)连接方式组成,即 header.payload.signature,如下 eyJhbGciOiJIUzI1NiIsInR5cCI6Ik ...

  4. [原创]SOUI GDI+渲染引擎下的字体特效,抛砖引玉

    由于SOUI是一种双渲染引擎的DUI库,默认在SKIA渲染引擎下是支持特效字体的,具体请参考DEMO中的源码. 但是使用GDI+渲染时是没有这些特效的,着实比较苦恼,此代抛砖引玉,细节实现 请自己再去 ...

  5. Qt之生成pdf(转)

    Qt中如何让图片.文本.HTML或者其他形式的内容生成pdf呢?主要利用QPrinter来实现,QPrinter不止可以操作打印机来打印纸张文件,并且可以将文件保存至磁盘,存储为pdf格式的文件.   ...

  6. CodeForces 427A Police Recruits (水题)

    题意:给定 n 个数,有正数和-1, -1表示罪犯,正数表示招了几个警察,一个警察只能看一个罪犯,并且要按顺序,问你有多少罪犯逃脱. 析:很简单么,从开始扫到最后,把是正数就加上,是-1判断剩余警察大 ...

  7. 设计模式13:Template Method 模板方法模式(行为型模式)

    Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...

  8. 编写高质量代码改善C#程序的157个建议——建议146:只对外公布必要的操作

    建议146:只对外公布必要的操作 那些没有必要公开的方法和属性要声明成private.如果需要公开的方法和属性超过9个,在VS默认的设置下,就需要滚屏才能显示在Intellisense中,如图: Sa ...

  9. Strict Weak Ordering

    Description A Strict Weak Ordering is a Binary Predicate that compares two objects, returning true i ...

  10. SQL2008中sa账户无法登陆问题

    实验需要用Java与SQL Server连接,因为使用的 SQL 2008 Express Edition 是基于 Visual Studio2010 安装包安装时一起安装的,所以为了方便数据库的操作 ...