我被问到一个面试问题:如何使用new运算符在不同的函数中分配一个类的两个对象,以便它们使用相同的内存空间?
任何人都可以解释如何实现这一目标吗?感谢。
编辑:所以主要的问题是如何创建一个类Memory_Alloc,所有其他类都应该使用它来为它们的对象分配内存。我想过使用Handles。然后他问我上面的问题。
答案 0 :(得分:3)
问题有点模糊,但我可以使用:
答案 1 :(得分:1)
使用placement-new:
/* define class Foo */
void fun1(void * p) { ::new (p) Foo; }
void fun2(void * p) { ::new (p) Foo; }
int main()
{
void * p = ::operator new(sizeof(Foo));
fun1(p);
p->~Foo();
fun2(p);
p->~Foo();
::operator delete(p);
}
不要写那样的代码。
答案 2 :(得分:1)
不可能,因为两个对象总是占用不同的地址,这也是空对象仍然具有大于零的大小的原因。也就是说,对于一个技巧问题,你可以创建一个对象,再次销毁它,并在同一个位置创建另一个对象。
现在,还有一个问题:究竟什么是“记忆空间”?面试官是否意味着地址空间?
答案 3 :(得分:1)
我们如何使用new运算符在不同的函数中分配一个类的两个对象,以便它们使用相同的内存空间?
使用placement new
运算符来执行此操作。
通常,new运算符负责在堆中查找内存块 这足以处理你请求的内存量。新的运算符 被称为placement new,允许您指定要使用的位置。 您可以使用此功能设置自己的内存管理过程,或者处理通过特定地址访问的硬件或在特定内存位置构建对象。
struct AType
{
};
void func(AType*& p)
{
p = new (p) AType;
}
int main()
{
AType *p1 = new AType;
func(p1);
}
另见placement new wiki链接