
c++笔记
文章平均质量分 71
阳光开朗_大男孩儿
不为未发生的事担忧,不为过去的事后悔。与其担忧,不如做好当下,与其后悔,不如行动弥补
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
access C++判断文件是否存在
access 函数的基本原理是直接向操作系统查询给定路径对应的文件或目录是否存在,并是否具有特定的访问权限。它不会区分你传入的是。,只要它存在,access(path, F_OK) 就返回 0(成功),否则返回 -1 并设置 errno。你也可以组合这些权限位,例如:R_OK | W_OK 表示检查是否可读且可写。此时无论 path 是一个。,并且满足权限检查条件,就会返回成功。检查是否可执行/可搜索(对目录有效),只要这个路径在文件系统中。原创 2025-07-13 16:45:19 · 286 阅读 · 0 评论 -
‘make_unique’ is not a member of ‘std’
在编译C++代码时,如果遇到“‘make_unique’ is not a member of ‘std’”这样的错误,通常是因为你的C++标准库版本较旧,或者没有启用C++14标准及以上版本。如果你使用的是C++11标准,则需要升级到C++14或更高版本。在编译时,确保你的编译器使用了C++14或更高版本。如果你无法使用C++14或更高版本,可以手动实现一个简单的make_unique。确保你的编译器版本支持C++14或更高版本。如果版本较旧,可以考虑升级你的编译器。原创 2025-07-13 16:42:23 · 419 阅读 · 0 评论 -
什么是线程安全,如何保证线程安全?
线程安全(Thread Safety)是指多线程环境下,多个线程同时访问和操作同一资源时,程序的行为仍然是正确的,即不会因为多线程的并发操作而导致数据不一致或程序崩溃。原创 2025-03-19 14:39:10 · 688 阅读 · 0 评论 -
map、set和hashmap底层的实现?区别?hashmap一定比map效率高吗?
map和 set: 基于红黑树,提供有序存储,操作复杂度为 (O(\log n))。unordered_map和 unordered_set: 基于哈希表,提供无序存储,平均操作复杂度为 (O(1)),但最坏情况下为 (O(n))。效率: unordered_map 通常比 map 更高效,但在哈希冲突严重或需要有序存储时,map 可能更适合。原创 2025-03-19 14:33:37 · 433 阅读 · 0 评论 -
vector中的erase()迭代器什么时候失效?erase会释放内存吗?
调用 erase 后,指向被移除元素及其后的迭代器失效。erase 不会释放 vector 的内存容量,只是调整大小并销毁被移除的元素。如果需要释放未使用的内存,可使用 shrink_to_fit() 或交换技术。原创 2025-03-19 14:29:54 · 449 阅读 · 0 评论 -
vector底层实现原理?如何扩容的?clear会清除对应的内存吗?如何实现内容的清除和内存的释放?
std::vector 使用动态数组实现,保证元素连续存储。当需要扩容时,vector 会分配更大的内存块,搬移元素,然后释放旧内存。clear() 方法只是清除元素,不会释放内存。使用 shrink_to_fit() 或重新分配内存的方法可以实现内容清除和内存释放。原创 2025-03-19 14:25:15 · 610 阅读 · 0 评论 -
C++中的友元类?C++中友元类的作用,为什么不用封装接口访问私有变量,友元类的好处?
要声明一个类为另一个类的友元类,可以使用 friend 关键字。class A {// 声明B为A的友元类private:class B {public:// 由于B是A的友元类,它可以访问A的私有成员在上面的例子中,类 B 被声明为类 A 的友元类,因此 B 可以访问 A 的私有成员 secret。友元类在C++中提供了一种灵活的方式来访问另一个类的私有成员,适用于类之间需要紧密协作的情况。尽管友元类可以提高代码的简洁性和性能,但也需要谨慎使用,以避免破坏封装和增加耦合度。原创 2025-03-19 14:20:24 · 442 阅读 · 0 评论 -
C++中的什么是内存泄漏?内存泄漏如何检查?
内存泄漏是C++编程中常见的问题,通常由动态分配的内存没有被正确释放导致。尽管手动检查代码可以发现一些内存泄漏,但借助工具(如Valgrind、AddressSanitizer、Visual Studio内存检查工具等)可以更高效地检测和解决内存泄漏问题。使用C++11及以上版本的智能指针也是预防内存泄漏的有效方法。原创 2025-03-19 14:14:48 · 225 阅读 · 0 评论 -
C++中的异常捕获?
在C++中,异常捕获是通过try、catch 和 throw 关键字来实现的。这些关键字用于处理程序运行过程中可能发生的异常情况,以便程序可以优雅地应对错误而不是崩溃。下面是详细的描述: 当一个函数检测到错误或异常情况时,它可以使用 throw 关键字抛出一个异常。异常可以是任意类型的对象(如整型、字符串、对象等)。异常捕获(try-catch) 为了捕获异常并处理它们,使用 try 和 catch 语句。try 块中包含可能抛出异常的代码,而 catch 块用于捕获和原创 2025-03-19 14:11:18 · 636 阅读 · 0 评论 -
C++中new和delete创建对象的流程?
在C++中,new 和 delete 操作符用于动态分配和释放内存。它们在创建和销毁对象时涉及多个步骤,包括内存分配、构造函数调用、析构函数调用和内存释放。原创 2025-03-19 14:03:02 · 355 阅读 · 0 评论 -
C++中new和delete如何构建简单对象和复杂对象?
在C++中,new 和 delete 操作符用于动态分配和释放内存。具体来说,它们可以用于构建简单对象(例如基本数据类型)和复杂对象(例如包含多个成员变量或自定义构造函数和析构函数的类对象)。原创 2025-03-19 13:51:02 · 333 阅读 · 0 评论 -
系统中内存分区
计算机内存按不同的管理和用途方式可以分为多个部分,包括:CPU缓存、主内存、硬盘存储、虚拟内存和外部存储等。每一部分内存都有不同的用途和特点,通过操作系统和硬件的配合,计算机能够高效地管理这些内存区域以满足不同的需求。原创 2025-03-19 13:13:12 · 381 阅读 · 0 评论 -
c++程序的内存分段
C++程序的内存划分通常分为以下几个部分:代码段、数据段、堆、栈、常量区以及程序内存映射。每一部分有不同的用途和特点,栈和堆特别重要,因为它们分别处理自动和动态内存分配。原创 2025-03-19 13:10:47 · 400 阅读 · 0 评论 -
智能指针循环引用
循环引用是指两个或多个对象互相持有对方的 std::shared_ptr,形成一个闭环。这个闭环导致它们的引用计数永远不为 0,从而内存无法被释放。以下是循环引用的情况的示例:假设有两个类 A 和 B,它们互相持有对方的 std::shared_ptr。这样就会形成一个循环引用。class B;// 前向声明class A {public:class B {public:// 创建 A 的 shared_ptr// 创建 B 的 shared_ptr。原创 2024-12-04 14:00:14 · 1213 阅读 · 0 评论 -
代码开发六个原则
在软件开发中,六大设计原则帮助开发者创建可维护、灵活和扩展性强的代码。原创 2024-10-29 11:36:28 · 734 阅读 · 0 评论 -
构造器重载过多反模式
构造器重载过多(Telescoping Constructor)反模式指的是在一个类中定义了多个构造函数,每个构造函数接受不同数量和类型的参数,以支持类的不同初始化方式。这种做法虽然表面上看是灵活的,但当构造函数参数数量和类型越来越多时,会导致代码的可读性和维护性变差。原创 2024-10-18 11:41:18 · 338 阅读 · 0 评论 -
c++链式调用
链式调用(Chaining)是一种设计方法,它允许你通过一个对象的多个方法连续调用,而不需要在每次调用后重新引用对象。这种方法在构建复杂对象时尤其有用,特别是在使用建造者模式时。在C++中,实现链式调用的常见方法是让每个方法返回对象本身的引用(通常是 *this)。这样,调用者就可以在同一个表达式中继续调用其他方法。原创 2024-10-18 11:39:49 · 1529 阅读 · 0 评论 -
友元类 继承
友元类(friend class)和继承(inheritance)是C++中两种不同的机制,用于实现类之间的关系和访问控制。它们有不同的用途和特点。原创 2024-10-18 11:35:29 · 493 阅读 · 0 评论 -
Kwin代码阅读——模板类
这一行开始定义模板类`EffectLoadQueue`。原创 2024-09-30 15:28:39 · 1159 阅读 · 0 评论 -
函数模板说明
类模板:模板参数在实例化类时指定,并且可以在整个类的范围内使用。函数模板:模板参数在调用函数时由编译器推导或者显式指定。这两种模板机制使得C++具有高度的泛型编程能力,允许编写类型安全且复用性强的代码。原创 2024-09-30 15:07:12 · 322 阅读 · 0 评论 -
单例的命名重复
简单来说,如果在不同的子目录下创建了相同名字的文件`DataInteraction.cpp`和`DataInteraction.h`,并且这些文件中都包含了相同的单例实现代码,那么每个子目录中的`DataInteraction`都会成为各自子目录的局部单例。如果在不同的目录中有相同名字的文件,并且它们被编译为不同的库,那么链接器将会将这些库中的符号分别保留,并且在链接时根据需要选择正确的符号。因此,当在其他地方引入`DataInteraction.h`时,编译器会根据当前上下文来选择相应目录下的实现。原创 2024-05-09 21:59:17 · 545 阅读 · 0 评论 -
类模板和函数模板
在 C++ 中,类模板和函数模板是用来创建通用类型的模板,允许在编写代码时将类型参数化。这种泛型编程方式可以帮助我们编写更通用、更灵活的代码,提高代码的重用性和可维护性。原创 2024-03-11 19:35:45 · 523 阅读 · 0 评论 -
shared_ptr的安全性
你可以试图通过调用`lock()`方法来将`weak_ptr`提升为`shared_ptr`,如果所监视的对象还活着(即引用计数大于0),`lock()`会成功返回一个有效的`shared_ptr`,否则返回一个空的`shared_ptr`。4. 将 `a` 赋值给 `b->a_ptr`,但由于 `b->a_ptr` 是 `std::weak_ptr`,它并不增加 `A` 实例的引用计数,所以 `A` 的引用计数仍然是1。使用`weak_ptr`可以避免这种情况,因为`weak_ptr`不增加引用计数。原创 2024-03-10 12:19:29 · 2022 阅读 · 0 评论 -
push_back 和emplace_back区别
push_back`和`emplace_back`是C++标准模板库(STL)中`std::vector`容器的成员函数,它们都用于在向量的末尾添加一个元素。在这个例子中,当使用`push_back`时,首先会调用`MyClass`的构造函数来创建一个临时对象,然后这个临时对象会被移动到向量中(如果支持移动语义)。而当使用`emplace_back`时,将直接在`std::vector`的内部存储空间中调用`MyClass`的构造函数,这个过程中不会创建临时对象,也就没有不必要的拷贝或移动操作。原创 2024-03-10 11:23:33 · 571 阅读 · 0 评论 -
虚函数表里存放的内容是什么时候写进去的?
当创建某个类的对象时,对象的构造函数会设置该对象中虚指针(vptr)的值,使其指向类的vtable。如果这个对象是基类类型的一部分(比如作为派生类的基类子对象),那么在构造基类部分时,它的vptr会先被设置指向基类的vtable,之后在派生类构造函数中可能会被更新为指向派生类的vtable。如果类B继承了类A,并且覆盖了一些虚函数,编译器会为B创建一个新的vtable,其中覆盖的虚函数指向B中的实现,而未覆盖的虚函数则指向A中的实现。虚函数表(vtable)里的内容是在。的,并且在程序启动时,即程序的。原创 2024-03-09 12:03:09 · 577 阅读 · 0 评论 -
返回值优化(RVO)和命名返回值优化(NRVO)
在这个例子中,如果编译器应用了RVO,那么`MyClass`类型的对象将直接在`obj`的存储位置被构造,而不是首先在`createMyClass`的局部作用域内构造然后复制或移动到`obj`。这个对象将直接在`main`函数中的`obj`变量的位置被构造,而不是先在`createMyClass`函数中构造然后再拷贝或移动到`obj`。如果编译器应用了NRVO,`result`对象会直接在`obj`的位置被构造,而不是先在函数`createMyClass`中构造然后复制或移动。这通常发生在返回临时对象时。原创 2024-03-09 11:05:38 · 2246 阅读 · 1 评论 -
c++ 类内可以定义引用数据成员吗?
在这个例子中,`MyClass`类包含一个对`int`类型的引用`myRef`作为其数据成员。在`main()`函数中,我们创建了一个名为`obj`的`MyClass`对象,并将整数`value`的引用传递给它。在C++中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象。原创 2024-03-09 10:39:00 · 857 阅读 · 0 评论 -
拷贝构造函数和移动构造函数
从C++11开始,可以使用`= default;`和`= delete;`来显式地要求编译器默认生成或禁用这些函数。原创 2024-03-07 10:49:27 · 3626 阅读 · 0 评论 -
const 的作用
在C++中,`const`变量一经定义必须立即初始化,因为之后你将无法修改它们的值。这是因为`const`关键字用于定义常量值,这意味着该值在编译时就应该是已知的,并且在程序的整个生命周期中不会改变。// 正确:const变量在定义时初始化// 错误:未初始化的const变量// 错误:不能给const变量赋值编译器会报错,因为`myConst`被定义为`const`但没有被初始化。一旦定义了`const`变量,就不能再给它赋值,因为`const`本意就是表明该变量的值在定义后不可变。此外,原创 2024-03-06 18:06:10 · 1693 阅读 · 0 评论 -
c++内存泄漏
因此,栈内存通常不会发生内存泄漏,因为一旦函数返回,栈上的内存就会自动释放。在使用动态内存分配(如C/C++中的`malloc`/`new`)时,程序员有责任在不再需要分配的内存时释放它(使用`free`/`delete`)。上动态分配的内存没有被适当释放,导致程序失去了对这些内存块的引用,使得这些内存即使不再需要,也无法被操作系统回收。内存泄漏存在多方面的因素,但大多数内存泄漏通常是因为程序错误或疏忽造成的,归纳总结后,存在以下几种(只是博主的理解,如果发现有缺失的部分,欢迎纠正)原创 2024-03-05 15:54:58 · 1167 阅读 · 1 评论 -
c++继承
本文旨在记录,继承的作用和继承后成员函数和变量的访问权限等问题。继承是面向对象编程的一个基本概念,继承支持代码的复用,能够建立一种层级关系,使得可以在现有类的基础上创建新类,同时保留原类的特性。:当一个类以方式继承另一个类时,的和的访问属性在派生类中。基类的被派生类访问,但可以通过的公有和保护成员函数来访问。:当一个类以 protected 方式继承另一个类时,:当一个类以 private 方式继承另一个类时,基类的公有和保护成员在派生类中都成为私有成员。原创 2024-03-05 15:31:42 · 552 阅读 · 1 评论