不同尺寸的新展示位置 class
Placement new on a different size class
所以我最近遇到了新的展示位置,对此我有一个疑问。我知道当你想在已经分配的内存上分配一个对象时,会使用 placement new。
假设我有一个名为 foo 的 class,它有 20 个字节。
我会用它做一些操作,然后我会为一个名为 bar 的 class 调用一个新的位置,它有 10 个字节。
不属于新对象的最后 10 个字节会怎样?放置新分区是否只需要所需的内存量,在本例中为 10 字节?还是指针只携带额外的 10 个字节直到它被释放?
另一种情况,假设我首先开始为 class 栏分配内存,即 10 个字节。然后我将放置 new class foo,这是 20 个字节。编译器会分配更多内存吗?还是我必须确保事先分配足够的内存?
What happens to the last 10 bytes that is not part of the new object.
那些额外的字节仍然可供您使用。只有使用正确的释放方法,它们才会被正确释放。
// 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;
And another case, lets say I've first started of by allocating memory for class bar, which is 10 bytes. I'll then placement new class foo, which is 20 bytes. Will the compiler allocate more memory?
不,编译器不会分配更多内存。这将导致未定义的行为。
What happens to the last 10 bytes that is not part of the new object.
什么都没有。 Placement-new 不会触及它。它不知道该内存块中是否已经存在其他内容。您可以轻松地为 2 个 bar
对象分配大小,在后 10 个字节中构造一个 bar
对象,然后在前 10 个字节中构造另一个 bar
对象。想一想如果 placement-new 做了一些事情超出了您提供的内存地址的范围并且它破坏了内存后半部分的 bar
会发生什么。不好。所以它不会那样做。
Does placement new partition only the amount of memory required, which is in this case 10bytes?
是的。 Placement-new 将简单地调用 bar
构造函数,将指定的内存地址作为构造函数初始化的起始地址传递给它。构造函数将只初始化它需要的内存部分。由于bar
class是10个字节,所以最多只能初始化10个字节。其余 10 个字节保持不变。
Or does the pointer just carry around the extra 10 bytes until it is deallocated.
如果分配20个字节并在前10个字节中构造一个bar
,则剩余的10个字节将仅存在于内存中的bar
对象之后,而不是[=的一部分10=] 对象本身。你可以用这 10 个字节做任何你想做的事。
And another case, lets say I've first started of by allocating memory for class bar, which is 10 bytes. I'll then placement new class foo, which is 20 bytes. Will the compiler allocate more memory?
没有。 placement-new 只是在您提供的内存地址处构造指定的 class 。您有责任确保内存足够大以容纳正在构造的 class。
Or do I have to make sure to allocate enough memory beforehand?
是的。
所以我最近遇到了新的展示位置,对此我有一个疑问。我知道当你想在已经分配的内存上分配一个对象时,会使用 placement new。
假设我有一个名为 foo 的 class,它有 20 个字节。
我会用它做一些操作,然后我会为一个名为 bar 的 class 调用一个新的位置,它有 10 个字节。
不属于新对象的最后 10 个字节会怎样?放置新分区是否只需要所需的内存量,在本例中为 10 字节?还是指针只携带额外的 10 个字节直到它被释放?
另一种情况,假设我首先开始为 class 栏分配内存,即 10 个字节。然后我将放置 new class foo,这是 20 个字节。编译器会分配更多内存吗?还是我必须确保事先分配足够的内存?
What happens to the last 10 bytes that is not part of the new object.
那些额外的字节仍然可供您使用。只有使用正确的释放方法,它们才会被正确释放。
// 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;
And another case, lets say I've first started of by allocating memory for class bar, which is 10 bytes. I'll then placement new class foo, which is 20 bytes. Will the compiler allocate more memory?
不,编译器不会分配更多内存。这将导致未定义的行为。
What happens to the last 10 bytes that is not part of the new object.
什么都没有。 Placement-new 不会触及它。它不知道该内存块中是否已经存在其他内容。您可以轻松地为 2 个 bar
对象分配大小,在后 10 个字节中构造一个 bar
对象,然后在前 10 个字节中构造另一个 bar
对象。想一想如果 placement-new 做了一些事情超出了您提供的内存地址的范围并且它破坏了内存后半部分的 bar
会发生什么。不好。所以它不会那样做。
Does placement new partition only the amount of memory required, which is in this case 10bytes?
是的。 Placement-new 将简单地调用 bar
构造函数,将指定的内存地址作为构造函数初始化的起始地址传递给它。构造函数将只初始化它需要的内存部分。由于bar
class是10个字节,所以最多只能初始化10个字节。其余 10 个字节保持不变。
Or does the pointer just carry around the extra 10 bytes until it is deallocated.
如果分配20个字节并在前10个字节中构造一个bar
,则剩余的10个字节将仅存在于内存中的bar
对象之后,而不是[=的一部分10=] 对象本身。你可以用这 10 个字节做任何你想做的事。
And another case, lets say I've first started of by allocating memory for class bar, which is 10 bytes. I'll then placement new class foo, which is 20 bytes. Will the compiler allocate more memory?
没有。 placement-new 只是在您提供的内存地址处构造指定的 class 。您有责任确保内存足够大以容纳正在构造的 class。
Or do I have to make sure to allocate enough memory beforehand?
是的。