#include iostreamusing namespace std;class Singlepublic static Single getSingle if nullptr == m_ptr lock 瑙e喅澶氱嚎绋嬪畨鍏ㄩ棶棰 ifnullptr == ptr m_ptr = new Single; return m_ptr; void show
在main函数中,你尝试使用delete关键字删除了ptr1指针,并且之后又调用了ptr1指针的成员函数destory()。这是错误的操作,因为在destory()函数中已经删除了m_ptr指针的内存,所以再次使用ptr1指针是未定义行为,会导致程序崩溃。
此外,在getSingle()函数中,你在创建Single对象之后,没有为m_ptr指针赋值。正确的操作应该是将新创建的对象地址赋给m_ptr指针。
修正后的代码如下:
#include <iostream>
using namespace std;
class Single
{
public:
static Single* getSingle() {
if (nullptr == m_ptr) {
// lock //瑙e喅澶氱嚎绋嬪畨鍏ㄩ棶棰?
// if(nullptr == ptr)
m_ptr = new Single;
}
return m_ptr;
}
void show() {
cout << "show" << endl;
}
void destory()
{
delete m_ptr;
}
private:
Single(const Single& obj) = delete;
Single() {
cout << "Single" << endl;
}
~Single() {
cout << "~Single" << endl;
}
static Single* m_ptr;
};
Single* Single::m_ptr = nullptr;
int main()
{
Single* ptr1 = Single::getSingle();
ptr1->show();
ptr1->destory();
Single* ptr2 = Single::getSingle();
return 0;
}
注意,这里不再需要在析构函数中将m_ptr指针赋为nullptr,因为它是静态成员变量,程序结束时会自动销毁,不需要手动删除
原文地址: http://www.cveoy.top/t/topic/iR2j 著作权归作者所有。请勿转载和采集!