C++内存分配

references:

C++ 自由存储区是否等价于堆?


c++ new 与malloc有什么区别

C++, Free-Store vs Heap

1. 栈:由编译器自动分配释放,存放函数的参数值,局部变量等值。

2. 堆:堆允许程序在运行时动态地申请某个大小的内存。通常由malloc/free开辟和释放。

3. 程序代码区:存放函数体的二进制代码。

4. 全局/静态存储区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

5. 常量存储区:存放常量。

(自由存储区:自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。很多编译器的new/delete都是以malloc/free为基础来实现的。)

static关键字

references:

nowcoder


作用、内存分配、初始化、生命周期、作用域

1. 全局静态变量

2. 局部静态变量

3. 静态函数

4. 类的静态成员变量

5. 类的静态函数

C++和C的区别

references:

nowcoder


设计思想上:

C++是面向对象的语言,而C是面向过程的结构化编程语言

语法上:

C++具有封装、继承和多态三种特性

C++相比C,增加多许多类型安全的功能,比如强制类型转换(4个cast)

C++支持范式编程,比如模板类、函数模板等

C++中四种cast转换

references:

c/c++强制类型转换


为何使用dynamic_cast转换类指针时,需要虚函数?

1. const_cast

用于将const指针、引用、对象转为非const。

const int a = 1;

const int* b = &a;

cout << (*b) << endl;

int* c = const_cast<int *>(b);

*c = 10;

cout << (*b) << endl;

2. static_cast

用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知 。

3. dynamic_cast

用于动态类型转换,只用于对象的指针和引用,只能用于含有虚函数的类因为要通过虚函数表判断继承关系)。支持类向上向下转化。与static_cast不同,向下转化时dynamic_cast会检查操作是否有效,如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。

Son *a;

Fa* aa = dynamic_cast<Fa*>(a); \(\quad\) //向上转型

4. reinterpret_cast

处理无关类型之间的转换。比如把指针转为int。

C/C++ 中指针和引用的区别

references:

nowcoder


1.指针有自己的一块空间,而引用只是一个别名;

2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;

3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用;

4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;

5.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;

6.指针可以有多级指针(**p),而引用只有一级;

7.指针和引用使用++运算符的意义不一样;

8.如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。

对象通过指针获取申请的堆上内存,指针是指向动态内存区域的唯一方式,而引用实质是对象的一个别名,对象被析构之后,引用将会失效,所以可能会使得堆上的内存空间没有及时释放,造成内存泄露。

C++中的四个智能指针

references:

四种智能指针使用总结


nowcoder

为什么要使用智能指针:

智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。

1. auto_ptr(C++11已弃用)

采用所有权模式。

auto_ptr< Obj> p1 (new Obj());

auto_ptr< Obj> p2;

p2 = p1;

此时再调用 p1就会异常,因为 auto_ptr的拷贝构造函数中把真实引用的内存指针进行的转移,也就是说 p2应引用了内存地址,而 p1引用的内存地址为空。

2. unique_ptr

实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。不能拷贝构造,但是可以移动构造和移动赋值

//移动赋值

unique_ptr< Son> p1(new Son());

unique_ptr< Son> p2 = (std::move(p1));

此时,p1不再拥有对象的内存地址,因为这是手动赋值,所以比auto_ptr安全。

3. shared_ptr

可以多个智能指针同时拥有一个对象。

原理:

使用引用计数,每当引用一次,引用计数加一,每当智能指针销毁了,引用计数就减一,

当引用计数减少到0的时候就释放引用的对象。这种引用计数的增减发生在智能指针的构造函数,拷贝构造函数,赋值操作符,析构函数中。

成员函数:

use_count 返回引用计数的个数

unique 返回是否是独占所有权( use_count 为 1)

swap 交换两个 shared_ptr 对象(即交换所拥有的对象)

reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少

shared_ptr< Obj> p1(new Obj());

shared_ptr< Obj> p2 = p1;

shared_ptr< Obj> p3(p1);

p2.reset();

cout << p1.use_count() << endl;

4. weak_ptr

因为shared_ptr是一种强引用的关系,智能指针直接引用对象,可能引起循环引用,从而造成内存泄漏比如此链接

解决这种状况的办法就是将两个类中的一个成员变量改为weak_ptr对象,因为weak_ptr不会增加引用计数,使得引用形不成环,最后就可以正常的释放内部的对象,不会造成内存泄漏。weak_ptr从字面意思上可以看出是一个弱指针,不是说明这个指针的能力比较弱,而是说他对他所引用的对象的所有权比较弱,

weak_ptr是一种不控制对象生命周期的智能指针, 它指向一个shared_ptr管理的对象,他并不拥有所引用对象的所有权,而且他还不能直接使用他所引用的对象(可以通过lock()来获得一个shared_ptr对象)。当一个weak_ptr所观察的shared_ptr要释放它的资源时,它会把相关的weak_ptr的指针设置为空,防止weak_ptr持有悬空的指针。

数组与指针的区别

什么是野指针

Hash冲突的解决办法

  1. 开放地址法(再散列法):对冲突的键p,以p为基础,得到p1,直到没有冲突。有线性探测再散列、二次探测再散列、伪随机再散列。
  2. 再哈希法:再哈希一遍。
  3. 拉链法:用链表存取发生冲突的关键字

最新文章

  1. PHP相关代码
  2. T-Sql(七)用户权限操作(grant)
  3. NSURLErrorDomain -999 &quot;Canceled&quot; 错误探究
  4. Android万能使用WebServices(不用引入外部包)
  5. ASP.NET MVC 3 使用Model自定义验证的样式
  6. ruby的optparse使用小记
  7. delete archivelog all 无法彻底删除归档日志?
  8. Windows下安装Eric5时出现的“Sorry, please install QtHelp.”问题解决办法
  9. Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  10. Drupal设置首页默认内容
  11. MySQL数据库学习02: SELECT语句
  12. 干货分享:Neutron的PPT,帮助你理解Neutron的各种细节
  13. Python中的一些小技巧
  14. MySQL之索引原理
  15. 任务超时退出的方法 C#
  16. LaTeX参考文献出现问号
  17. linux配置iptables(3)
  18. Java之静态代码块
  19. Netty 入门初体验
  20. Java的I/O流问题

热门文章

  1. Java自学笔记1206
  2. 全栈性能测试修炼宝典-JMeter实战笔记(二)
  3. Obligations for calling close() on the iterable returned by a WSGI application
  4. 2021最新WordPress安装教程(一):Centos7安装Apache
  5. StreamingContext详解,输入DStream和Reveiver详解
  6. swap交换2变量
  7. 从ReentrantLock实现非公平锁的源码理解AQS中的CLH队列
  8. 从微信小程序到鸿蒙js开发【04】——list组件
  9. python工业互联网应用实战5—Django Admin 编辑界面和操作
  10. HDU-6874 Decision 倍增 (2020 HDU多校 D7 D)