在不同大小的类上放置新的位置
Placement new on a different size class
所以我最近遇到了新的安置,我有一个关于它的问题。当你想在已经分配的内存上分配对象时,可以使用位置new。
假设我有一个名为foo的类,它有20个字节。
我将对它做一些操作,然后我将为一个名为bar的类调用放置new,它有10个字节。
不属于新对象的最后10个字节会发生什么?放置新分区是否只需要所需的内存量,在本例中是10字节?或者指针只是携带额外的10字节,直到它被释放?
另一种情况,假设我首先为类bar分配了10个字节的内存。然后我将放置新的类foo,这是20个字节。编译器会分配更多内存吗?或者我必须确保事先分配足够的内存吗?
不属于新对象的最后10个字节怎么办
什么都没有。放置-新不触及它。它不知道那个内存块中是否已经存在其他东西。您可以轻松地为2个bar
对象分配大小,在第二个10个字节中构造一个bar
对象,然后在前10个字节中构造另一个bar
对象。想象一下,如果place -new做了一些事情,超出了您提供的内存地址的范围,并且损坏了内存的后半部分的bar
,将会发生什么。不好的。所以它不会那样做
放置新分区是否只需要所需的内存量,在本例中是10字节?
是的。Placement-new只需调用bar
构造函数,将指定的内存地址传递给它,作为构造函数初始化的起始地址。构造函数只初始化它需要的那部分内存。由于bar
类是10个字节,因此初始化的字节不能超过10个字节。
或者指针只携带额外的10字节,直到它被释放。
如果分配20个字节并在前10个字节中构造一个bar
,那么剩余的10个字节将存在于内存中的bar
对象之后,而不是bar
对象本身的一部分。你可以用这10个字节做任何你想做的事。
另一种情况,假设我首先为类bar分配了10个字节的内存。然后我将放置新的类foo,这是20个字节。编译器会分配更多内存吗?
。placementnew只是在您提供的内存地址上构造指定的类。你有责任确保内存足够大以容纳正在构造的类。
或者我必须确保事先分配足够的内存?
是的。
不属于新对象的最后10个字节怎么办
这些额外的字节仍然可供您使用。只有使用正确的解分配方法,它们才会被正确地解分配。
// Allocate memory.
char* buffer = new char[20];
// Construct a Foo using placement new
Foo* fooPtr = new (buffer) Foo;
// Use fooPtr
// ...
// Call the destructor for fooPtr explicitly.
// Don't call delete fooPtr. That will lead to
// undefined behavior.
fooPtr->~Foo();
// Now the memory is ready to be resued.
// Construct a Bar using placement new
Bar* barPtr1 = new (buffer) Bar;
// If there is enough space, you can use:
Bar* barPtr2 = new (buffer+sizeof(Bar)) Bar;
// Use barPtr1 and barPtr2
// ...
// Now call the destructor on the pointers explicitly.
barPtr1->~Bar();
barPtr2->~Bar();
// Deallocate the memory that corresponds to the method used to
// allocate it.
delete [] buffer;
另一种情况,假设我首先为类bar分配了10个字节的内存。然后我将放置新的类foo,这是20个字节。编译器会分配更多内存吗?
不,编译器不会分配更多的内存。这将导致未定义的行为
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于'regular'程序