当传递内存不足指针时,位置为新

Placement new when passed insufficient memory pointer

本文关键字:位置 指针 内存不足      更新时间:2023-10-16

我只是想知道当它传递一个不足以分配的缓冲区时,新位置会如何表现。但它似乎还是成功了。下面是我的代码:

#include <stdio.h>
#include <malloc.h>
#include <new>
class MyClass
{
    public:
        char data;
        char data1;
};

int main() {
    printf("sizeof MyClass: %lun", (unsigned long)sizeof(MyClass));
    void *place = malloc(sizeof(MyClass) - 2);
    MyClass *ptr = new (place) MyClass();
    ptr->data = 10;
    ptr->data1 = 20;
    printf("%dn", ptr->data1); //This seems to have work fine, storing the data as always
}

这是预期的行为吗?谁来解释一下这是怎么回事。谢谢。

PS:我用的是64位Ubuntu系统,g++编译器。

在不够大的内存块上调用placement new是未定义的行为。它可以(在真实的程序中很可能会)清除堆。

未定义行为是未定义的,因此程序可以显示正常运行,即使您可能会丢弃不属于您的内存。您的简单示例甚至没有尝试释放它分配的内存,因此您从未真正测试堆以查看它是否损坏。

位置new与分配无关。它不知道也不关心你传递的缓冲区有多大——实际上,它唯一的工作就是调用对象的构造函数,该对象将从你传递给它的地址开始分配(并且可能适合)。