C++ 语言 内存管理面试题

C++阿木 发布于 1 天前 1 次阅读


C++ 内存管理面试题解析与代码示例

内存管理是 C++ 程序员必须掌握的核心技能之一。在面试中,内存管理往往是考察的重点,因为它直接关系到程序的性能和稳定性。本文将围绕 C++ 内存管理这一主题,解析一些常见的面试题,并提供相应的代码示例。

1. 深拷贝与浅拷贝

面试题
什么是深拷贝和浅拷贝?请举例说明。

解析
深拷贝和浅拷贝是针对对象拷贝的概念。

- 浅拷贝:仅复制对象中的数据成员的值,如果数据成员是指针类型,则复制指针值,而不是指针指向的数据。
- 深拷贝:复制对象中的数据成员的值,如果数据成员是指针类型,则复制指针指向的数据。

代码示例
cpp
include
include

class MyClass {
private:
char data;

public:
MyClass(const char str) {
data = new char[strlen(str) + 1];
strcpy(data, str);
}

// 浅拷贝构造函数
MyClass(const MyClass& other) {
data = other.data; // 浅拷贝
}

// 深拷贝构造函数
MyClass(MyClass& other) {
data = new char[strlen(other.data) + 1];
strcpy(data, other.data); // 深拷贝
}

~MyClass() {
delete[] data;
}

void print() const {
std::cout << data << std::endl;
}
};

int main() {
MyClass obj1("Hello");
MyClass obj2 = obj1; // 浅拷贝
MyClass obj3(obj1); // 深拷贝

obj1.print(); // 输出: Hello
obj2.print(); // 输出: Hello
obj3.print(); // 输出: Hello

return 0;
}

2. 析构函数与拷贝构造函数

面试题
为什么 C++ 需要析构函数和拷贝构造函数?

解析
C++ 需要析构函数和拷贝构造函数来管理对象的内存和资源。

- 析构函数:用于释放对象所占用的资源,如动态分配的内存、文件句柄等。
- 拷贝构造函数:用于创建对象的副本,确保副本与原对象拥有独立的资源。

代码示例
cpp
include

class MyClass {
private:
int data;

public:
MyClass(int value) {
data = new int(value);
}

~MyClass() {
delete data;
}

MyClass(const MyClass& other) {
data = new int(other.data);
}

void print() const {
std::cout << data << std::endl;
}
};

int main() {
MyClass obj1(10);
MyClass obj2 = obj1;

obj1.print(); // 输出: 10
obj2.print(); // 输出: 10

return 0;
}

3. 引用计数

面试题
什么是引用计数?请举例说明。

解析
引用计数是一种内存管理技术,用于跟踪对象被引用的次数。

- 当一个对象被创建时,其引用计数初始化为 1。
- 当一个对象被复制时,引用计数增加。
- 当一个对象被销毁时,引用计数减少。当引用计数为 0 时,对象所占用的内存被释放。

代码示例
cpp
include

class MyClass {
private:
int data;
int refCount;

public:
MyClass(int value) : data(new int(value)), refCount(1) {}

~MyClass() {
delete data;
}

MyClass(const MyClass& other) : data(other.data), refCount(other.refCount + 1) {}

void release() {
if (--refCount == 0) {
delete data;
}
}

void print() const {
std::cout << data << std::endl;
}
};

int main() {
MyClass obj1(10);
MyClass obj2 = obj1;
MyClass obj3 = obj2;

obj1.print(); // 输出: 10
obj2.print(); // 输出: 10
obj3.print(); // 输出: 10

obj2.release();
obj3.release();

return 0;
}

4. 智能指针

面试题
什么是智能指针?请列举几种常见的智能指针类型。

解析
智能指针是一种自动管理内存的指针,它可以自动释放所指向的对象所占用的内存。

- unique_ptr:独占指针,确保指针指向的对象在指针被销毁时自动释放。
- shared_ptr:共享指针,允许多个指针共享同一个对象,引用计数管理内存释放。
- weak_ptr:弱指针,用于观察共享指针所指向的对象,但不增加引用计数。

代码示例
cpp
include
include

class MyClass {
public:
void print() const {
std::cout << "Hello, World!" << std::endl;
}
};

int main() {
std::unique_ptr obj1(new MyClass());
std::shared_ptr obj2(new MyClass());
std::weak_ptr obj3 = obj2;

obj1->print();
obj2->print();
obj3.lock()->print();

return 0;
}

总结

本文围绕 C++ 内存管理这一主题,解析了几个常见的面试题,并提供了相应的代码示例。掌握这些知识点对于 C++ 程序员来说至关重要,可以帮助他们编写出高效、稳定的代码。