问题描述
1 在静态库libxxx.a中定义了一个全局的string对象
2 有多个so文件都连接了这个静态库, 并且引用了这个全局变量
3 有一个程序同时加载了多个上述的so文件
4 在这个程序退出时, 全局的string就会被多次析构
5 stl的string对象析构多次就会导致程序crash
解决方案
使用智能指针, 而不是直接使用string对象, 这样即使析构多次也没有问题
下面是我实现的一个简单的智能指针, 供参考
template <class T> class MySmartPtr
{
public:
explicit MySmartPtr(T *p) : m_p(p) {}
~MySmartPtr()
{
if(m_p){
delete m_p;
// 防止被析构多次
m_p = NULL;
}
}
// 解引用
T& operator*() { return *m_p; }
// 用于访问T的成员变量
T* operator->() { return m_p; }
// 用于访问T的成员变量
T& get() { return *m_p; }
protected:
MySmartPtr(const MySmartPtr<T>& rhs);
void operator=(const MySmartPtr<T>& rhs);
T *m_p;
};