用于新运算符分配的公共内存
Common memory for new operator allocations
有人问我一个面试问题:如何使用 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);
}
永远不要写这样的代码。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配