用于新运算符分配的公共内存

Common memory for new operator allocations

本文关键字:内存 分配 运算符 用于      更新时间:2023-10-16

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

谁能解释一下如何实现这一目标?谢谢。

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

这个问题有点模糊,但在我的头顶上你可以使用:

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

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

现在,还剩下一个问题:究竟什么是"内存空间"?面试官的意思是地址空间吗?

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

使用placement new运算符来执行此操作。

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

struct AType
{
};
void func(AType*& p)
{
  p = new (p) AType;
}
int main()
{
  AType *p1 = new AType; 
  func(p1);
}

另请参阅放置新维基链接

使用新放置:

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

永远不要写这样的代码。