如何在堆栈或堆上定位变量

时间:2013-09-19 07:07:32

标签: c++ solaris

我有一些不寻常的要求,变量应始终存在于堆上而不是堆栈上。现在我尝试使用私有析构函数和类的静态方法来执行此操作,它只需要指针并在其上调用delete。

Class A
{
public :
static void method(const A* ptr)
{
delete ptr;
}
private :
~A();
};

但是现在我只是好奇看到更好的altrnative并且我想到的一件事是,如果我可以为每个方法添加一些预检查以查看wheather变量是在堆栈上还是在堆上然后我不必声明静态方法。 谁能告诉我怎么做?我只想得到一个解决方案就是使用sbrk(0)或pthread API获取当前堆栈的边界,然后将其与类变量的地址进行比较,但不能移植。

由于 Niraj Rathi

1 个答案:

答案 0 :(得分:2)

实际上,您的解决方案不起作用。

using Buffer = std::aligned_storage<sizeof(A), alignof(A)>::type;

int main() {
    // Allocate scratch area to build a 'A'
    Buffer buffer;

    // Build a 'A' using placement new
    new (&buffer) A();

    // Ensure proper deletion at end of scope using `unique_ptr`
    // and a custom deleter (and cast to `A*` as we go).
    std::unique_ptr<A, A::method> a(reinterpret_cast<A*>(&buffer));

    a->method(0);
    // ...
}

因此,除了防止任意销毁之外,还需要防止任意构造(包括复制构造和移动构造)。您可以将赋值保留为公共因为它分配给现有对象,并通过控制构造确保所有现有对象都放置在您希望的位置。