gpt4 book ai didi

c++ - 在一个类的第一个/最后一个实例存在之前/之后调用一对函数。有没有更好的办法?

转载 作者:行者123 更新时间:2023-12-02 10:07:56 27 4
gpt4 key购买 nike

我有一对函数initshutdown以及一些类RefTest

我需要在首次实例化init时调用RefTest,并在shutdown的最后一个实例销毁时调用RefTest。在程序中,这也可能发生多次。

我提出的一种实现如下所示。但这对我来说似乎并不理想(例如,它不是线程安全的)。
我考虑过使用std::shared_ptr并将这些函数放在类ctor / dtor中,但似乎无法正常工作。

有更好的方法吗?

测试实现:

#include <iostream>
void init() { std::cout << "init() called" << std::endl; }
void shutdown() { std::cout << "shutdown() called" << std::endl; }

static size_t s_refCount = 0;
class RefTest
{
public:
explicit RefTest()
{
if(s_refCount++ == 0) init();
std::cout << "ctor()" << std::endl;
}
~RefTest()
{
std::cout << "dtor()" << std::endl;
if(--s_refCount == 0) shutdown();
}
};

int main(int argc, char *argv[])
{
{
RefTest t1;
RefTest t2;
RefTest t3;
}
RefTest t4;
return 0;
}

输出:
init() called
ctor()
ctor()
ctor()
dtor()
dtor()
dtor()
shutdown() called
init() called
ctor()
dtor()
shutdown() called

最佳答案

But this doesn't seem ideal to me (e.g. it is not thread-safe).


std::atomic<int>帮助解决此问题-但仅是部分问题。它可以使计数器成为线程安全的,因此您不必尝试多次调用 init / shutdown

它不会解决在第一次调用仍在执行时再次调用构造函数的问题。 (然后使用部分构造的对象)

关于c++ - 在一个类的第一个/最后一个实例存在之前/之后调用一对函数。有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253911/

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