C++ 用于新操作员分配的公共内存

C++ 用于新操作员分配的公共内存,c++,c++11,C++,C++11,我被问到一个采访问题:我们如何使用新操作符在不同的函数中分配一个类的两个对象,使它们使用相同的内存空间 有人能解释一下这是如何实现的吗?谢谢 编辑:所以主要的问题是如何创建一个类Memory_Alloc,它应该被所有其他类用来为它们的对象分配内存。我考虑过使用手柄。然后他问我上述问题 具有新位置: /* define class Foo */ void fun1(void * p) { ::new (p) Foo; } void fun2(void * p) { ::new (p) Foo;

我被问到一个采访问题:我们如何使用新操作符在不同的函数中分配一个类的两个对象,使它们使用相同的内存空间

有人能解释一下这是如何实现的吗?谢谢

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

具有新位置:

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

永远不要编写这样的代码。

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

struct AType
{
};

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

int main()
{
  AType *p1 = new AType; 
  func(p1);
}
现在,还有一个问题:究竟什么是“内存空间”?面试官是指地址空间吗

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

使用
placement new
操作符执行此操作

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

struct AType
{
};

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

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

另请参见wiki链接

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

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

新操作员使用相同内存空间的原因是什么?:)即使你可以通过placement new来完成,你为什么要这么做?我相信面试官希望你让新操作员超负荷使用自定义分配器。@user315052 Ok。你是指标题中的分配器类吗?@Nitin:我的意思是面试官希望你重载全局
new
操作符,并使用
Memory\u Alloc
返回分配的内存。好吧,我不会编写不向函数传递非可选参数的代码。.-]