自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 举例死锁?解决死锁的方法?

如果 Thread A 先获取了 Resource X 的锁,而 Thread B 先获取了 Resource Y 的锁,然后它们都等待对方释放所需的资源,就会产生死锁的情况。- 死锁超时机制:设置合理的超时时间,在一定时间内无法获取所需资源时,释放已经占有的资源,防止死锁的发生。死锁是多线程编程中需要特别注意的问题,需要采取适当的策略,如避免资源竞争、使用加锁的顺序等,以防止死锁的发生。一旦检测到死锁,可以采取相应的措施进行处理。- 合理的资源申请顺序:按照固定的顺序获取资源,降低死锁的概率。

2023-05-17 09:37:41 461

原创 进程和线程的区别?

进程(Process)和线程(Thread)是计算机中的两个重要概念,用于描述并发执行的基本单位。

2023-05-17 09:32:05 129

原创 STL容器的线程安全性?

需要注意的是,即使STL容器本身是线程安全的,但在多线程环境下使用时,仍需要注意对迭代器的操作可能会引起容器的线程安全问题。如 map,set,unordered_map,unordered_set)和无序容器(如 unordered_map,unordered_set)的线程安全版本为其加了。(如 vector,deque,list,forward_list,string)的线程安全版本为其加了 _safe 后缀,例如 std::vector。t 后缀,例如 std::map_mt。

2023-05-17 09:18:56 1395

原创 reserve()怎么用?shrink_to_fit()的用法?

reserve()是 vector 的成员函数,用于预分配 vector 的内存空间,可以避免频繁的内存分配和复制操作,提高 vector 的效率。在上面的示例中,我们首先创建了一个空的 vector,其大小为 0,容量为 0。然后,调用reserve()函数预分配 10 个元素的内存空间。此时,vector 的大小仍为 0,容量为 10。接着,通过函数将 10 个元素添加到 vector 中。最后,我们输出 vector 的大小和容量,发现 vector 的大小为 10,容量仍为 10。

2023-05-17 09:04:54 312

原创 vector、list、deque、priority_queue、multiset、unordered_map、哈希表的底层实现原理?什么时候使用vector、list以及deque?

std::deque` 在内存中的布局与 `std::vector` 类似,但是由于元素块的大小是固定的,因此 `std::deque` 的缓存性能优于 `std::list`。`std::list` 内部使用双向链表实现,可以在 O(1) 时间内对任意位置的元素进行插入和删除操作,但是由于 `std::list` 在内存中存储的元素是分散的,因此访问元素时具有较差的缓存性能。同时,由于 `std::deque` 的元素块大小是固定的,因此它可以在内存中保持高效的缓存使用,从而提高程序的性能。

2023-05-17 08:57:32 671 1

原创 什么是深拷贝?什么是浅拷贝?

深拷贝(Deep Copy)是指在拷贝对象时,不仅会拷贝对象本身的值,还会为指向的内存动态分配一段新的内存空间,将原对象指向的。当一个类的对象被拷贝时,如果它的成员变量中包含指针类型的成员变量,那么拷贝操作就需要涉及到深拷贝和浅拷贝。,而不是复制指针指向的内存空间。这样,在拷贝对象后,如果原对象的指针类型成员变量所指向的内存被修改,到新的内存中,从而实现独立的复制。这样,在拷贝对象后,如果。浅拷贝(Shallow Copy)是指在拷贝对象时,只是。

2023-05-17 08:45:31 172

原创 什么时候生成默认构造函数?

如果已经显式定义了任何构造函数(包括默认构造函数、拷贝构造函数和移动构造函数),编译器将不再生成默认构造函数。如果需要同时使用已经定义的构造函数和默认构造函数,可以通过显示定义一个无参构造函数来实现。默认构造函数没有参数,并且执行默认的初始化操作,即将类的成员变量全部初始化为默认值(对于内置类型,为0;在 C++ 中,如果没有显式定义任何构造函数,编译器会自动生成一个默认构造函数(Default Constructor)。没有定义任何构造函数(包括默认构造函数、拷贝构造函数和移动构造函数);

2023-05-17 08:39:22 256

原创 malloc、free和new、delete的区别?

都是用于动态内存管理的函数/操作符,但它们在使用上有很大的区别,需要根据具体情况选择合适的方式。在 C++ 中,推荐使用。进行内存管理,以确保类型安全和自动调用构造函数和析构函数。返回的是分配对象的指针,不需要显式地进行类型转换。需要分配或释放的字节数,编译器会自动计算。是 C 语言标准库中的函数,而。不会调用构造函数和析构函数。可能存在类型不匹配的问题。是 C++ 中的操作符。需要注意的是,如果使用了。可以确保类型安全,而。在 C++ 中,使用。为单位进行内存管理,

2023-05-17 08:36:58 348

原创 堆和栈的特点?

堆适用于需要动态分配、大小不确定或需要长时间存储的对象,而栈适用于函数调用期间的临时变量、局部对象和函数调用的上下文信息。静态分配:栈内存的分配和释放是在编译时确定的,由编译器自动管理,遵循后进先出(LIFO)的原则。短生命周期:栈内存的生命周期与所在函数的调用周期相对应,当函数执行结束时,栈上的内存自动释放。动态分配:堆内存的分配和释放是在程序运行时动态进行的,可以根据需要动态地申请和释放内存。堆和栈是计算机内存中两种不同的存储方式,具有不同的特点和用途。

2023-05-16 21:59:07 322

原创 互斥器是什么?

当一个线程需要访问共享资源时,它会请求锁定互斥器。如果互斥器当前未被锁定,则该线程获得锁定并可以进行访问;否则,该线程需要等待互斥器解锁后才能再次尝试获得锁定。当线程访问完共享资源后,它会释放互斥器,使得其他线程可以访问共享资源。互斥器可以使用多种方式实现,例如基于硬件的互斥器、基于操作系统的互斥器和基于用户空间的互斥器等。在实际编程中,选择适合场景的互斥器实现可以提高程序的效率和可靠性。当多个线程需要访问共享资源时,为了避免出现数据竞争(data race)等问题,需要对这些线程的访问进行协调和同步。

2023-05-16 21:54:40 110

原创 如何避免野指针?

1、初始化指针:在定义指针时,一定要给它赋一个有效的初始值,或者将其设置为 NULL(或 nullptr),以确保指针不指向未知内存地址。2、避免悬挂指针:指针指向的内存地址被释放后,指针就成了悬挂指针,访问悬挂指针会导致程序崩溃或产生不可预测的结果。3、避免指针越界:访问指针越界会导致程序崩溃或产生不可预测的结果。为了避免指针越界,应该始终确保指针指向的内存地址是有效的,并且不要超出其分配的内存范围。

2023-05-16 21:52:10 715 1

原创 引用与指针作用及区别?

总的来说,引用更加安全和易读,因为它们必须在声明时进行初始化,并且不能指向其他变量。指针则更加灵活和通用,因为它们可以指向任何类型的变量,并且可以进行地址运算。引用必须在声明时初始化,并且一旦初始化后,就不能再指向其他变量;指针是一个变量,它存储了另一个变量的地址,可以具有自己的语义。,也可以被赋值为 NULL(或 nullptr)。引用通常用于函数参数和返回值,它们可以使函数调用更简洁和易读。引用没有自己的地址,而指针有自己的地址,可以进行地址运算。通过指针,可以间接地访问该变量。

2023-05-16 21:38:58 130

原创 static,const的作用?

1、static。

2023-05-16 21:32:56 591 1

原创 c++中有什么数据类型?在vs2019中各占多少字节?

在 C++ 中,数据类型的大小(占用的字节数)是由编译器和操作系统决定的,不同的编译器和操作系统可能会有不同的规定。需要注意的是,以上数据类型的大小只是一种常见的情况,实际情况可能会因编译器、操作系统、编译选项等因素而有所不同。在编写代码时,应尽量避免依赖于数据类型的大小,而是使用 sizeof 运算符来动态获取数据类型的大小。

2023-05-16 21:25:01 679

原创 override和overloading的区别?

的方法,以实现不同的功能。在编译时根据传递的参数类型和数量确定调用哪个方法。重载方法必须具有不同的参数列表。重载通常用于提供多种不同的方法签名,以方便程序员使用。在面向对象编程中,重载(overloading)和覆盖(overriding)是两个常见的概念,它们都与函数或方法有关,但有着不同的含义和用途。(polymorphism),即同一个方法调用可以在不同的对象上产生不同的行为。覆盖方法必须具有相同的方法签名(即方法名称、参数类型和返回类型)。1、重载(overloading)是指在同一类中定义多个。

2023-05-16 21:22:05 201

原创 C++里面容器有哪些?关联式容器有哪些?

关联式容器是一种数据结构,它以键-值对(key-value pair)的形式存储元素,允许快速的元素查找和插入。在C++ STL中,关联式容器是通过红黑树实现的,提供了快速的查找、插入、删除等操作。std:: map:用于存储键值对,并根据键的大小进行,可以用下标访问键值对。:与std::map类似,但。std:: set:用于存储唯一的元素,自动进行。:与std::set类似,但。:与std::map类似,但使用实现,。:与类似,但允许键。:与std::set类似,但使用实现,。:与类似,但允许元素。

2023-05-16 21:05:09 264

原创 如何区分成员函数和构造函数?

成员函数是类中定义的任何其他函数,它们被设计为执行类的操作或提供类的服务。成员函数必须在类的定义中声明,并且可以在类的外部或内部实现。成员函数可以有参数和返回值,它们可以访问类的数据成员和其他成员函数。构造函数是一个特殊的成员函数,用于创建并初始化类的对象。构造函数的名称必须与类的名称相同,它没有返回值,并且在对象创建时自动调用。因此,区分成员函数和构造函数的最简单方法是查看函数的名称和是否有返回值。在面向对象编程中,成员函数和构造函数是类中定义的两种不同类型的函数。

2023-05-16 20:55:04 673

原创 迭代器是什么?迭代器和容器的区别?

当迭代器到达集合的末尾时,它会返回一个特殊值,例如 None 或 null,以指示遍历已经完成。迭代器模式可以提高代码的复用性和可读性,因为它允许客户端代码使用相同的方式来处理不同类型的集合对象。在许多编程语言中,迭代器已经内置在语言中,例如 Python 中的迭代器协议和 C++ 中的迭代器类。迭代器是一种设计模式,用于按顺序访问集合对象的元素,而无需暴露集合对象的底层实现。在编程语言中,迭代器通常是一个对象,它可以在集合对象中逐个访问元素,而不需要了解集合对象的内部实现。

2023-05-16 20:52:53 499

转载 int为什么占4位,1位为什么是8个字节?

http://t.csdn.cn/IUmKD

2023-02-15 17:23:24 150

原创 《Primer C++ 第五版》第一章1.5节练习 头文件Sales_item.h

【代码】《Primer C++ 第五版》第一章1.5节练习 头文件Sales_item.h。

2022-10-21 17:02:42 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除