2

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

谁能解释这是如何实现的?谢谢。

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

4

4 回答 4

3

这个问题有点含糊,但在我脑海中你可以使用:

  • Placement new -- 使用 new 操作符来初始化相同的内存地址
  • 重载新运算符——重载新运算符以返回相同的地址
  • 委托——使用指向实现习语的指针,使两个对象指向同一个实现对象
于 2013-01-29T22:37:34.273 回答
1

新位置:

/* 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);
}

永远不要写那样的代码。

于 2013-01-29T22:30:37.703 回答
1

不可能,因为两个对象总是占用不同的地址,这也是空对象的大小仍然大于零的原因。也就是说,对于一个技巧问题,您可以创建一个对象,再次销毁它,然后在同一位置创建另一个对象。

现在,剩下一个问题:“内存空间”到底是什么?面试官的意思是地址空间吗?

于 2013-01-29T22:33:06.180 回答
1

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

使用placement new运算符来做到这一点。

通常,new 运算符负责在堆中找到足够大的内存块来处理您请求的内存量。new 运算符称为placement new,它允许您指定要使用的位置。您可以使用此功能来设置自己的内存管理过程或处理通过特定地址访问的硬件或在特定内存位置构造对象。

struct AType
{
};

void func(AType*& p)
{
  p = new (p) AType;
}

int main()
{
  AType *p1 = new AType; 
  func(p1);
}

另请参阅放置新wiki 链接

于 2013-01-29T22:34:59.443 回答