您是否相信您的C ++课程正在正确处理资源?忽略 三个规则 可能会导致内存泄漏,浅副本和未注明的错误,可以终止您的应用程序。在本教程中,我们将讨论C ++中的三个规则,为什么它对于动态内存处理,复制构造函数和破坏者以及如何避免程序中的资源管理问题很重要。
目录:
了解C ++中的三个规则
三个规则是指出的C ++编程原则: 如果类需要用户定义的驱动器,复制构造函数或复制分配运算符,则可能需要所有三个。 该规则可确保适当的资源管理,并防止诸如浅副本,内存泄漏和悬空指针之类的问题。它主要适用于管理动态资源(例如堆分配的内存,文件手柄或其他系统资源)的类。
- 驱动器
- 复制构造函数
- 复制分配操作员
三个特别成员
通常,如果一类管理动态分配的资源,则需要三个特殊的成员功能:
1。驱动器(〜className())
- 当对象离开范围时,将动态分配的资源释放。
- 释放堆内存以避免内存泄漏
例子:
输出:

MyClass在其构造函数中为整数分配内存,并将其在其破坏者中进行处理以避免内存泄漏。专用的成员函数显示()用于打印存储的值,而在退出对象范围后,驱动器处理清理方面。如果需要,请实现复制构造函数和分配运营商(以避免诸如浅副本之类的问题)资源。
2。复制构造函数(className(const className&other))
- 定义按值传递时如何复制对象的方式。
- 如果班级负责动态资源,请确保深入复制。
例子:
输出:

以下C ++程序是向您展示课堂上深层复制的概念。 MyClass的构造函数将内存分配给堆上的整数,并且复制构造函数通过分配内存的内存并将值复制到其中,以深入复制该值。避免内存泄漏:驱动器可以释放内存。 display()函数打印出存储的值,并通过创建和显示两个对象来进行深层复制的主要函数测试。
3。复制分配运算符(操作员=(const className&other))
- 定义对象是如何分配了同一类型的另一个现有对象
- 更新对象时保证正确的资源管理
例子:
输出:

这是使用复制分配运算符复制的一个示例。该类Malloc在其构造函数中为整数进行整数,当将一个对象分配给另一个对象时,操作员在杂交新内存并复制该值之前会释放旧内存。驱动器:避免内存泄漏。每当对象被破坏时,它就会被调用,以使内存交易。主函数通过将一个描述符分配给另一个描述并打印值来深入测试。
C ++中三个规则的优势
- 在C ++中,三个规则是一个内存管理原则,要求程序员定义三个特殊功能,以防止使用管理动态内存的类(例如,堆内存)分配和Deallocation的类时资源泄漏。
- 它不制作浅副本,让对象管理其资源。
- 它还允许受控的对象分配,从而减轻对象的浅或深层复制可能出现的副作用。
C ++中三个规则的缺点
- 要维护的更多代码: 基本上,当您处理多个资源时,它需要正确实现一些其他成员功能,以添加更多代码以维护。
- 性能开销: 对于大物体,深层复制可能很昂贵。
- 手动资源管理: 这增加了复杂性,尤其是当您处理多个资源时。
C ++中三个规则的替代方案
尽管三个规则对于C ++ 11之前的C ++版本中的资源管理很重要,但C ++引入了更精致的指南,以降低整体复杂性并提高性能。两个主要的选择是五规则和零规则。
五(C ++ 11及以后)的规则
五个规则基于三个规则,增加了两个特殊成员功能:
- 移动constructor(className(className && other))
- 移动分配操作员(operator =(className && other)
这些功能使一个对象从另一个对象“窃取”资源,而不是制作昂贵的深副本。这种优化可以改善性能,尤其是对于大型对象或控制堆内存的物体的对象。
例子:
输出:

在上面的代码中,该类管理动态分配的整数并分配 深拷贝, 这 移动语义 正确处理资源。内存分配是在借助 复制构造函数 和 复制分配操作员 为了防止所有权问题。为避免不必要的深副本, 移动构造函数 和 移动分配操作员 使用。这 驱动器 确保正确清理并防止内存泄漏。
零规则(C ++ 11及以后)
这 零规则 遵循一种不同的方法,而不是手动实现特殊成员函数,以自动管理资源。这取决于标准库的功能 std :: unique_ptr,std :: shared_,ptr, 和 std :: vector。 这种方法遵循RAII(资源获取为初始化)原则,以确保在没有明确驱动器操作的情况下进行适当的管理。
例子:
输出:

以上代码遵循 零规则。 对于自动内存管理,此方法使用 std :: unique_ptr。 它确保通过RAII进行安全有效的资源处理,零规则消除了对击振或特殊构造函数的需求。
选择正确的方法
- 遵循 五个规则 如果课程处理原始动态资源。
- 喜欢 零规则 如果您的班级使用标准库容器或智能指针来避免内存管理。
结论
在C ++中, 三个规则 在管理动态资源,适当的内存处理和防止浅副本时至关重要。此方法用于分配资源的类 堆内存,文件处理。 但是,现代C ++ 零规则 和 五个规则 管理关键应用程序的性能也很重要。
FAQ关于C ++中三个规则是什么
1。定义C ++中的三个规则
这 三个规则 是一种方法,如果某个类需要驱动器,复制构造函数和复制分配运算符。
2。三个规则的重要性是什么?
三个规则的重要性是,在处理动态资源时,它会防止内存泄漏和浅副本。
3。提及三个规则的用法
当您的班级主要管理动态资源等动态资源(例如堆分配的内存,文件手柄或其他系统资源)时,使用三个规则。
4。三个规则与五个规则有何不同?
通过添加 移动语义, 五个规则扩展了三个规则。
5。如何避免三个规则?
可以通过使用诸如std :: simolor_ptr和std :: shared_ptr之类的智能指针来避免三个规则,然后使用零规则。