【问题标题】:Is stack-only variable possible in C++?在 C++ 中是否可以使用仅堆栈变​​量?
【发布时间】:2011-04-30 15:30:39
【问题描述】:

目前我想在多线程环境中制作包装访问器类。这个类的目的很简单——在它的构造上获取一个锁,在它的销毁上释放一个锁。除此之外,它与普通指针相同。此外,我想防止它在堆区创建,以确保最终释放锁。

逆向相当简单(使用工厂方法的私有构造函数),但我不知道只有堆栈的变量是可能的。到底有没有?

【问题讨论】:

  • 我认为这样的事情是不必要的。每个体面的程序员都应该知道使用 new/delete 需要自己承担风险。如果程序员想要这个对象在堆上并抛弃类存在的意义,让他们。
  • 你要求的是不可能和不必要的。如果一个不称职的程序员使用您的代码,他们将设法破坏自己的应用程序无论如何。如果他们有能力,那么他们会按照预期的方式分配你的锁对象:在作用域上下文中。
  • “保护墨菲,而不是马基雅维利” - Herb Sutter
  • 如果您还没有想到有人想要unique_ptr<MyLock> lock(new MyLock()) 的正当理由怎么办?这是一个具有有趣的附加功能的锁,可以在函数和范围之间移动。糟糕,您只是无缘无故地先发制人地搞砸了他们。

标签: c++ stack


【解决方案1】:

我不明白这个问题?在函数范围内定义的任何变量都是仅堆栈的。

class Lock {
public:
    Lock() {
        performLock();
    }

    ~Lock() {
        performUnlock();
    }
}

void foo() {
    // ... Code
    Lock onStackOnly;
    // ... Code that is locked
}


void foo() {
    // ... Code
    {
        Lock onStackOnly;
        // ... Code that is locked
    }

    // This code is unlocked.
}

【讨论】:

  • “我想阻止它在堆区创建”。他希望new Lock(); 不可能
  • 他的问题是关于如何强制在块范围内定义变量并防止在堆上进行任何实例化。
【解决方案2】:

那么,你如何为你的班级重载 operator new 并将其设为私有?

【讨论】:

  • 谢谢。到目前为止,我已经完全忘记了 operator new !虽然不能完全阻止它在堆区创建(因为它可以是new操作符创建的对象中的成员变量),但它有助于防止很多错误。
  • @summerlight:我相信不可能完全阻止它在堆编译时或可移植地创建。
  • 是的,即使是私有的operator new,也需要 5 行代码来编写一个 包含您的对象并且可以分配的包装器对象在堆上。与往常一样,在编写 C++ 库代码时,您无法规定用户必须 如何使用它。您必须假设库用户是理智的,并且实际上不会尝试破坏他自己的程序。如果你做出这样的假设,那么你就不需要让你的对象无法堆分配。
  • 这在一般情况下不起作用,但也许对于这种特殊用途来说是可以的。已在堆栈上定义的新运算符有一些用途。特别是新的展示位置仍然有效。
猜你喜欢
  • 2017-08-21
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2011-01-28
  • 2019-09-22
  • 2021-10-13
  • 2023-03-26
相关资源
最近更新 更多