C++面试 深浅拷贝问题

本文探讨了C++中的浅拷贝问题及其可能导致的资源重复释放风险,介绍了深拷贝作为解决方案的原理。同时,文章提到了在面试中需要对深浅拷贝有深入理解,并讨论了在foreach循环中使用auto时可能遇到的问题及其避免方法。最后,文章简述了C++11引入的移动构造函数,这是一种更高效的资源转移方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、浅拷贝问题

(1)如果类class中叧包含简单数据成员,没有指向堆的指针, 可以使用编译器提供的默认复制构造函数,但是这种情况很少。很多时候我们都会在头文件定义很多需要指向堆的指针。

 如果发生浅拷贝等、默认复制构造函数等问题是极其危险的操作,会发生段错误,析构函数去两次释放同一个地址。

我的理解是浅拷贝是拷贝了对象的引用,因此地址不变。

int main()
{
	{// 花括号让s1和s2变成局部对象,方便测试
		String s1;
		String s2(s1);// 复制对象,s1临时对象作为s2的参数去复制。这样会让里面的指针指向同一个地址。
     //如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。
	}
}

复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用。

(2)要解决浅拷贝问题,C++中引入了深拷贝。
深拷贝:
给每个对象独立分配资源,保证多个对象之间不会因共享资源而造成多次释放造成程序崩溃问题。

String(const String& s)//拷贝构造  参数是自己
		:_str(new char[strlen(s._str) + 1]) //赋值列表开辟空间
	{
		strcpy(_str, s._str);  
	}
	String& operator=(const String& s)	//赋值运算符重载
	{
		if (this != &s)//防止自己给自己赋值
		{
			_str =  new char[strlen(s._str) + 1]; //得到新
### Linux 环境下 C++ 面试问题及答案 #### 1. C++ 和 C 的区别是什么? C++ 是在 C 基础上进行了扩展和完善的一种编程语言,不仅保留了 C 的面向过程特性,还引入了面向对象的概念。这使得 C++ 支持类、对象、继承、多态等高级特性[^3]。 #### 2. 解释一下什么是 RAII (Resource Acquisition Is Initialization)? RAII 是一种资源管理技术,在 C++ 中非常常用。它指的是通过构造函数获取资源,并在析构函数中释放资源的方法。这种方式能有效防止资源泄漏并简化异常处理逻辑[^1]。 ```cpp class FileHandler { public: FileHandler(const char* path) : file_(fopen(path, "r")) {} ~FileHandler() { fclose(file_); } private: FILE* file_; }; ``` #### 3. STL 容器有哪些?它们之间有什么不同? 标准模板库(STL)提供了多种容器类型用于存储不同类型的数据集合。常见的有 vector(动态数组),list(双向链表), deque(双端队列),set/map(关联容器)。 - `vector` 提供连续内存分配,支持随机访问; - `list` 使用节点链接方式实现,适合频繁插入删除操作; - `deque` 结合两者优点,两端均可快速增删元素; - `set/multiset` 自动排序且不允许重复键值; - `map/multimap` 键值对映射关系,同样保持有序排列。 #### 4. 如何理解拷贝控制成员函数? 拷贝控制成员主要包括复制构造函数(copy constructor)、赋值运算符重载(operator=)以及析构函数(destructor)三部分。当定义了一个新对象作为已有对象副本时会调用前者;而后者则是在两个已存在对象间发生赋值行为时触发。为了确保深浅拷贝正确无误地执行,通常需要自定义这些特殊方法来满足特定需求。 #### 5. 多线程环境中如何保护共享变量的安全性? 在多线程应用里,多个线程可能同时读取或修改同一个全局/静态变量,这就可能导致竞态条件(race condition)的发生。为了避免这种情况,可以采用互斥锁(mutex lock)机制来进行同步控制: ```cpp #include <mutex> std::mutex mtx; void thread_func(int id){ std::lock_guard<std::mutex> guard(mtx); // Critical section here... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值