传递内存指针不足时放置新的

时间:2011-11-06 04:45:51

标签: c++ c++11

我只是想知道当传递一个不足以进行分配的缓冲区时,new的行为会如何表现。但无论如何它似乎都成功了。这是我的代码:

#include <stdio.h>
#include <malloc.h>
#include <new>

class MyClass
{
    public:
        char data;
        char data1;
};


int main() {
    printf("sizeof MyClass: %lu\n", (unsigned long)sizeof(MyClass));

    void *place = malloc(sizeof(MyClass) - 2);

    MyClass *ptr = new (place) MyClass();

    ptr->data = 10;
    ptr->data1 = 20;
    printf("%d\n", ptr->data1); //This seems to have work fine, storing the data as always
}

这是预期的行为吗?有人请解释一下这是如何工作的。谢谢。

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

2 个答案:

答案 0 :(得分:3)

在不足以满足该类型的内存块上调用new new是未定义的行为。它可以(并且可能会在真正的程序中)丢弃你的堆。

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

答案 1 :(得分:2)

Placement new与分配无关。它不知道也不关心你传递的缓冲区有多大 - 它唯一的工作就是在一个对象上调用构造函数,该对象应该开始分配(并且可能适合)你传递给它的地址。 / p>