动态内存管理类、对象移动、移动构造函数和移动赋值运算符

简介: 动态内存管理类、对象移动、移动构造函数和移动赋值运算符

13.5动态内存管理类

1.某些类需要自己进行内存分配,这些类一般来说必须定义自己的拷贝控制成员来管理分配的内存。

2.如果没有可用空间,vector就会重新分配空间,且将已有元素移动(或拷贝,但这里是移动)到空间中,释放旧空间,并添加新元素。

13.6对象移动

13.6.1右值引用

1.我们可以将一个const的引用绑定到一个右值上,非常量引用初始值必须为左值。

2.右值引用只能绑定右值,后置递增递减运算符生成右值,前置版本生成左值。其两个特性是:所引用的对象将要被销毁,该对象没有其他用户。

3.任何变量都是左值,包括右值引用类型的变量也是左值,所以不能将右值引用绑定到这些类型上,除非调用标准库move函数,如:int && rr3 = std::move(rr1);调用后rr3将是rr1的别名,他们公用一块内存,相当于左值引用。

(书上说对于一个移后源,我们可以 销毁和赋值它,但是不能使用它的值,可是我在多种编译器上都输出了它的值,不知道为什么,很迷惑)

4.使用move的代码应该使用std::move而不是move,这样可以避免潜在的名字冲突。

13.3.2移动构造函数和移动赋值运算符

1.将拷贝构造函数的左值引用改为右值引用,就变成了移动构造函数

2.为了让移动构造函数和移动赋值运算符不抛出异常,必须在参数列表和初始化列表开始的冒号之间标记为noexcept,这个标记在声明和定义出都得加。

3.移动构造函数必须确保移后源处于一个可销毁但无害的状态,保持有效的、可析构的状态,但是用户不能对其值进行任何假设,其具有一个不确定的状态,对其调用std::move是危险的,当我们调用move时,必须绝对确认以后云对象没有其他用户。

4.make_move_iterator函数将一个普通迭代器转换为一个移动迭代器。此函数接受一个迭代器参数,返回一个移动迭代器。

5.防止右值被赋值就是在赋值运算符后加一个&引用限定符。

6.如果没有声明移动构造函数,那么用std::move转换会调用拷贝构造函数而不是移动构造函数

如:Copyable news = std::move(s);

7.move的头文件时utility,move的作用是将一个左值强制转换成一个右值引用类型,从而用于移动语义。

8.不能解引用一个空指针

相关文章
|
1月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
55 3
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
194 4
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
136 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
35 3
|
2月前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
2月前
|
存储 缓存 算法
结构体和类在内存管理方面有哪些具体差异?
【10月更文挑战第30天】结构体和类在内存管理方面的差异决定了它们在不同的应用场景下各有优劣。在实际编程中,需要根据具体的需求和性能要求来合理选择使用结构体还是类。
|
3月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
50 2
|
3月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
71 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
51 2
|
3月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
35 0
深入理解java对象的内存布局