面试题答案
一键面试- 设计思路:
- 使用互斥锁(Mutex)来保护共享结构体的访问和释放操作,防止竞态条件。
- 对于多级指针的结构体,需要设计递归或迭代的方式来释放所有动态分配的内存。
- 具体实现(以C语言为例):
- 定义结构体和互斥锁:
#include <pthread.h>
#include <stdlib.h>
// 假设内部结构体
typedef struct Inner {
int* data;
// 其他成员
} Inner;
// 外部结构体
typedef struct Outer {
Inner* inner;
// 其他成员
} Outer;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- 释放内部结构体内存的函数:
void freeInner(Inner* inner) {
if (inner) {
if (inner->data) {
free(inner->data);
}
free(inner);
}
}
- 释放外部结构体内存的函数:
void freeOuter(Outer* outer) {
pthread_mutex_lock(&mutex);
if (outer) {
if (outer->inner) {
freeInner(outer->inner);
}
free(outer);
}
pthread_mutex_unlock(&mutex);
}
- 在多线程中的使用:
- 在多线程环境下,当需要释放共享的
Outer
结构体时,调用freeOuter
函数。这样可以保证在释放内存时,通过互斥锁避免多个线程同时操作共享结构体,导致内存释放错误。同时,通过递归的方式正确释放了多级指针所指向的动态分配内存。
- 在多线程环境下,当需要释放共享的
在其他编程语言如C++中,也可以使用类似的机制,如C++的std::mutex
和智能指针(std::unique_ptr
等)来管理内存,在释放时结合互斥锁确保线程安全。例如:
#include <mutex>
#include <memory>
// 假设内部结构体
struct Inner {
std::unique_ptr<int[]> data;
// 其他成员
};
// 外部结构体
struct Outer {
std::unique_ptr<Inner> inner;
// 其他成员
};
std::mutex outerMutex;
void freeOuter(std::unique_ptr<Outer>& outer) {
std::lock_guard<std::mutex> lock(outerMutex);
outer.reset();
}
在这个C++示例中,std::unique_ptr
自动管理动态分配的内存,std::lock_guard
在构造时自动锁定互斥锁,在析构时自动解锁,从而保证内存释放的线程安全性。