防止创建具有静态生存期的对象
prevent creation of object with static lifetime
我们能否防止创建具有静态生存期的对象,同时允许创建具有自动生存期的对象?
如果希望防止用户创建具有自动持续时间的类的实例,可以将析构函数设为private。如果我们想阻止用户创建动态分配的实例,我们可以将operator new
设为private。
我认为不可能阻止用户创建具有静态存储持续时间的对象,因为唯一的区别是生命周期。但也许这里的一些专家能想出一个办法。
没有语言功能可以在编译时提供帮助。但是在运行时,您可以使用下面的技术来限制。假设您不希望MyObject
在static
存储区域上,那么在析构函数中添加如下代码:
bool ALLOW_OBJECTS = false; // global variable
struct MyObject // class body
{
~MyObject ()
{
if(ALLOW_OBJECTS == false)
<print error message>
// ...
}
};
现在,在您的main()
方法中,您可以将ALLOW_OBJECTS
设置为
int main ()
{
ALLOW_OBJECTS = true; // objects can be created now
// ... other code
ALLOW_OBJECTS = false; // reset to 'false' before main() ends
}
现在是一个事实,在main()
结束后,在static
存储中声明的变量将消失其生存期(调用析构函数)。因此,如果变量是在static
存储上声明的,它的析构函数将打印一条错误消息(在file或stdout中)。
使用此检查,您的1执行测试运行可能会失败,但是您可以在找到错误消息的数量后手动更正代码。因此,在您的生产代码中,您可以删除所有这些调试语句,并且您的代码将没有任何 static
存储对象 !!(不适用于pod和指针)。
在wikibooks中有一个要求或禁止基于堆的对象的收据。
关键是要使类析构函数受到保护,以便使用静态创建的对象将生成编译时错误。缺点是您必须为您的类实现和调用一个单独的delete方法。class HeapOnly {
public:
HeapOnly() {}
void destroy() const { delete this; }
protected:
~HeapOnly() {}
};
HeapOnly h1; // Destructor is protected so h1 can't be created globally
HeapOnly func() // Compiler error because destructor of temporary is protected
{
HeapOnly *hoptr = new HeapOnly; // This is ok. No destructor is invoked automatically for heap-based objects
return *hoptr;
}
int main(void) {
HeapOnly h2; // Destructor is protected so h2 can't be created on stack
}
相关文章:
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 数组对象的生存期是否在重用其元素存储时结束?
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- "std::function"的简单版本:函数对象的生存期?
- 有什么方法可以延长C++中临时对象的生存期吗
- 以延长构造函数外部 QT 对象的生存期
- QML QQmlPropertyList - 包含的对象生存期和'memory rules'
- 在函数调用中C++临时对象的生存期
- std::tie 和元组中返回的对象的生存期
- 是否存在对象存储在其生存期内可能会更改的情况?
- 从“if constexpr”分支扩展对象生存期/范围
- 在函数调用中创建的对象的生存期
- thread_local 和 std::future 对象 - 对象的生存期是多少