69,372
社区成员
发帖
与我相关
我的任务
分享
出于保密考虑就不贴原来的代码了 问题都在注释里 谢谢~~
A.h文件声明如下
class A{
public:
A();
~A();
static A* shareA();
std::string str;
};
A.cpp文件定义如下
static A* pa = NULL; //这里为何要设 static 有什么优势吗??
A::A(){
str = "sch";
}
A::~A(){
std::cout<<"~~AAA";//为什么不需要delete pa所指的对象?? 而且整个程序运行过程中始终不见这个析构函数的执行 很奇怪?
getchar();
}
A* A::shareA()
{
if(pa == NULL)
{
pa = new A;
}
return pa;
}
某个.cpp文件这样写
const char* pch ="";
pch = A::shareA()->str.c_str();
A* A::shareA()
{
static A pa;
return &pa;
}
namespace
{
std::unique_ptr<A> pa;
}
A* A::shareA()
{
if(pa == nullptr)
{
pa.reset(new A);
}
return pa.get();
}
static std::unique_ptr<A> pa;
//same as
/*
namespace
{
std::unique_ptr<A> pa;
}
*/
A* A::shareA()
{
if(pa == NULL)
{
pa.reset(new A);
}
return pa.get();
}
这里名字取shareA是挺怪的
让users误以为该自己负责reference count的部分A::~A(){
std::cout<<"~~AAA";//为什么不需要delete pa所指的对象?? 而且整个程序运行过程中始终不见这个析构函数的执行 很奇怪?
getchar();
}
如果在对象析构里删除,会有问题,因为不知道这个对象是不是最后一个对象,可能有其他地方用到了这个单实例对象,一般来说,会有一条特别的成员函数用于删除,或者在程序结束前再删除。