gpt4 book ai didi

c++ - 具有智能指针和析构函数的单例类被调用

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:26 24 4
gpt4 key购买 nike

我想创建一个单例类,这样当所有指向该类的指针都消失时,就会调用析构函数。

#include <memory>
#include <iostream>

class MyClass {
public:
uint8_t str[50]; //some random data
MyClass() {LOG("constructor Called"); }
~MyClass() {LOG("destructor Called");}
static std::shared_ptr<MyClass> &Get();

private:
static std::shared_ptr<MyClass> instance;
};

std::shared_ptr<MyClass> MyClass::instance=NULL;


std::shared_ptr<MyClass> &MyClass::Get()
{
if (instance == NULL)
{
instance= std::shared_ptr<MyClass>(new MyClass());
return instance;
}
return instance;
}

int main()
{
std::shared_ptr<MyClass> &p1 =MyClass::Get();

printf("We have %" PRIu32, p1.use_count());
if (1)
{
std::shared_ptr<MyClass> &p2 =MyClass::Get();//this should not
// create a new class
printf("We have %" PRIu32, p1.use_count()); //this should be two...
printf("We have %" PRIu32, p2.use_count()); //this should be two...
//when p1 goes out of scope here it should not call destructor
}
printf("We have %" PRIu32, p1.use_count());

//now destructor should be called
return 0;
}

上面的代码不起作用,因为静态实例是一个智能指针并且永远不会超出范围,因此永远不会调用析构函数。

我想做的是当静态实例第一次被创建时返回一个智能指针的这个实例,然后在返回这个智能指针的拷贝后每次调用那里。

最佳答案

std::weak_ptr 就是您要找的东西。

通过将实例更改为 weak_ptr,它不算作共享指针的所有者;这意味着一旦所有其他引用都被释放,该对象就会被销毁。也就是说,它确实使您的“获取”功能稍微复杂一些,因为您必须尝试从弱 ptr 获取 shared_ptr,然后在成功时返回它,或者在失败时创建一个新的,重新分配实例给它ptr 并返回。

您可以找到更多 here

作为一个单独的注释,静态成员的析构函数将被调用,只是不会在 main 返回之前。大多数人都接受静态的这个特性,因为一旦 main 返回,他们并不真正关心会发生什么,只要应用程序不崩溃(尽管使用其他静态的静态往往会导致这种情况)

关于c++ - 具有智能指针和析构函数的单例类被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47558290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com