对象如何知道它是在堆栈上还是在堆上分配的
How can an object know if it has been allocated on the stack or the heap?
可能重复:
如何判断一个对象是在构造函数上静态分配还是动态分配的?
struct Foo {
Foo ();
};
int main ()
{
Foo foo; // Case A
Foo * p_foo = new Foo (); // Case B
}
Foo :: Foo ()
{
if (allocated_on_stack) {
// Case A
}
if (allocated_on_heap) {
// Case B
}
}
Foo的构造函数能区分这两种情况吗?
这个问题的简短答案是否定的。
有一些理论上的解决方案,例如,您可以替换new
(在类或全局级别上(,并跟踪所有分配给new
的指针,并将此列表与构造函数中的this
指针进行比较。
struct Foo {
Foo ()
{
//Check if `this` is in s_instances
}
void* operator new(size_t size)
{
void* pointer = ::new(size);
s_instances.push_back(pointer);
return pointer;
}
void operator delete (void* pointer)
{
//remove from s_instances and call global delete
}
static std::vector<void*> s_instances;
};
(此代码无法捕获分配有new Foo[count]
的Foo(
为什么你需要这个?
没有独立于平台的方式。用户定义的方式很少。很少有,
(1( 您可能需要放置一个标志(作为private
变量(并进行检查。
struct Foo {
const bool isHeap;
Foo (bool heap = false) : isHeap(heap) {}
};
(2( 在超载new
内保持跟踪。
struct Foo {
static set<Foo*> heap;
void* operator new (size_t size)
{
void *p = malloc(size);
heap.insert(<p inside this set>);
}
};
Foo :: Foo ()
{
// check heap.find() for heap allocation
}
编辑:上述解决方案提供了一种方法,可以知道变量是自动的(通常在堆栈/数据段上(还是动态的(通常是在堆段上(。
相关文章:
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 我想知道我是否可以将一个类分配给特定的成员数据并创建该类的实例
- 我可以在堆栈上分配`std :: array`阵列,而不知道编译时大小
- 我不知道为什么会发生堆损坏(关于内存分配问题)
- 我怎么知道基类对象的指针数组中元素的类型,它将为派生类分配内存
- 当我们不知道类型的大小时,如何为它分配内存?
- 新操作员如何知道需要为特定类分配多少尺寸
- 我怎么知道std :: vector的分配记忆大小
- 如何知道何时重新分配向量的内部数组
- 你怎么知道如何解除指针数组的分配
- 如何正确实现对象列表的创建(和分配)仅由C++中的抽象基知道
- C ++unordered_map有没有办法为元素预先分配内存,如果事先知道最大大小
- 如何知道是什么分配了给定的内存块
- 当对象有一些动态分配的内存时,如何知道对象占用的所有内存
- C++删除堆分配数据的二进制数组-它会全部删除吗?关于删除,我应该知道些什么
- 我如何知道一个对象是否在堆上分配使用new
- 在头文件中声明一个动态分配的二维数组而不知道它的维数
- 编译器如何知道使用哪个操作符或函数分配了哪些内存
- delete(非数组形式)是否知道new或new[]分配的内存总量
- 动态分配.不知道这些错误意味着什么