新运营商分配的公共内存

时间:2013-01-29 22:18:50

标签: c++ c++11

我被问到一个面试问题:如何使用new运算符在不同的函数中分配一个类的两个对象,以便它们使用相同的内存空间?

任何人都可以解释如何实现这一目标吗?感谢。

编辑:所以主要的问题是如何创建一个类Memory_Alloc,所有其他类都应该使用它来为它们的对象分配内存。我想过使用Handles。然后他问我上面的问题。

4 个答案:

答案 0 :(得分:3)

问题有点模糊,但我可以使用:

  • placement new - 使用new运算符初始化相同的内存地址
  • 重载新运算符 - 重载新运算符以返回相同的地址
  • 委托 - 使用指向实现习惯用法的指针,使两个对象指向同一个实现对象

答案 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链接