我只是想知道当传递一个不足以进行分配的缓冲区时,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 ++编译器。
答案 0 :(得分:3)
在不足以满足该类型的内存块上调用new new是未定义的行为。它可以(并且可能会在真正的程序中)丢弃你的堆。
未定义的行为是未定义的,因此程序可以显示以正常进行,即使您可能会丢弃不属于您的内存。您的简单示例甚至不会尝试释放它分配的内存,因此您永远不会真正测试堆以查看它是否已损坏。
答案 1 :(得分:2)
Placement new与分配无关。它不知道也不关心你传递的缓冲区有多大 - 它唯一的工作就是在一个对象上调用构造函数,该对象应该开始分配(并且可能适合)你传递给它的地址。 / p>