面试题答案
一键面试-
设计思路:
- 使用智能指针(如
std::unique_ptr
或std::shared_ptr
)来管理SharedData
对象的内存,这样可以自动处理内存释放,避免内存泄漏。 - 为了确保多线程环境下的数据一致性和安全性,可以使用互斥锁(
std::mutex
)来保护对SharedData
对象的访问。 - 使用常指针(
const SharedData*
)来指向SharedData
对象,这样可以防止通过该指针意外修改SharedData
对象的内容。
- 使用智能指针(如
-
初始化常指针:
#include <memory> #include <mutex> class SharedData { public: // 假设包含不同类型的数据成员 int data1; double data2; }; std::mutex sharedDataMutex; std::unique_ptr<SharedData> sharedDataPtr; const SharedData* sharedDataConstPtr = nullptr; void initializeSharedData() { std::lock_guard<std::mutex> lock(sharedDataMutex); sharedDataPtr.reset(new SharedData()); sharedDataPtr->data1 = 10; sharedDataPtr->data2 = 3.14; sharedDataConstPtr = sharedDataPtr.get(); }
-
在线程函数中使用:
void threadFunction() { std::lock_guard<std::mutex> lock(sharedDataMutex); if (sharedDataConstPtr) { // 访问共享数据 int value1 = sharedDataConstPtr->data1; double value2 = sharedDataConstPtr->data2; // 使用数据进行操作 } }
-
处理常指针指向的数据的生命周期:
- 由于使用了
std::unique_ptr
来管理SharedData
对象的内存,当std::unique_ptr
被销毁时(例如在initializeSharedData
函数结束时超出作用域),它会自动释放SharedData
对象所占用的内存。 - 如果希望在不同地方共享
SharedData
对象的所有权,可以考虑使用std::shared_ptr
。std::shared_ptr
使用引用计数来管理对象的生命周期,当最后一个指向对象的std::shared_ptr
被销毁时,对象的内存才会被释放。例如:
std::mutex sharedDataMutex; std::shared_ptr<SharedData> sharedDataPtr; const SharedData* sharedDataConstPtr = nullptr; void initializeSharedData() { std::lock_guard<std::mutex> lock(sharedDataMutex); sharedDataPtr = std::make_shared<SharedData>(); sharedDataPtr->data1 = 10; sharedDataPtr->data2 = 3.14; sharedDataConstPtr = sharedDataPtr.get(); }
- 在这种情况下,只要还有
std::shared_ptr
指向SharedData
对象,对象的内存就不会被释放,从而保证了常指针指向的数据的有效性。同时,使用互斥锁来保护对sharedDataPtr
和sharedDataConstPtr
的访问,确保多线程环境下的安全性。
- 由于使用了