如何在堆栈或堆上定位变量
How to location of variable on stack or on heap
我有一些不寻常的要求,变量应该始终在堆上而不是堆栈上。现在我尝试使用私有析构函数和类的静态方法执行此操作,该方法将简单地获取指针并对其调用 delete。
Class A
{
public :
static void method(const A* ptr)
{
delete ptr;
}
private :
~A();
};
但是现在我只是好奇看到更好的altrnative,我想到的一件事是,如果我可以为每个方法添加一些预检查以查看哪个变量在堆栈上还是堆上,那么我就不必声明静态方法。谁能告诉我怎么做?我刚刚想到了一个解决方案,即使用 sbrk(0) 或 pthread API 获取当前堆栈的边界,然后将其与类变量的地址进行比较,但不可移植。
谢谢尼拉吉·拉蒂
实际上,您的解决方案不起作用。
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);
// ...
}
因此,除了防止任意破坏之外,您还需要防止任意构造(包括复制构造和移动构造)。您可以将赋值保留为公共状态,因为它分配给现有对象,并且通过控制构造,您可以确保所有现有对象都放置在您希望它们放置的位置。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- 指针变量 在数组中定位零
- 如何正确从uint16_t变量中提取一个特定位
- 如何在堆栈或堆上定位变量