当传递内存不足指针时,位置为新
Placement new when passed insufficient memory pointer
我只是想知道当它传递一个不足以分配的缓冲区时,新位置会如何表现。但它似乎还是成功了。下面是我的代码:
#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与分配无关。它不知道也不关心你传递的缓冲区有多大——实际上,它唯一的工作就是调用对象的构造函数,该对象将从你传递给它的地址开始分配(并且可能适合)。
相关文章:
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- C++指针数组到字符数组中的特定位置
- 声明指针时更改星号的位置
- 如何在单个链表中交换两个节点的位置,只修改指针
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- 如何在内存位置取消指针,并用值启动它
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- 最简单的方法使多个指针一次指向同一位置,一次只处理2个位置
- 在指针中保存确定的位置
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- 将指针数组传递给数组,以便在 malloc() 发生的位置发挥作用
- 为什么在递增后使用 [] 运算符访问指针数组会返回错误地址的当前内存位置
- 试图读取AIFF文件意外错误与指针位置等有关
- 使用指针在字符串中获取字符的位置
- qtextstream弄乱了其位置指针
- 我如何知道一个位置指针在二维数组的行数
- 修正:访问冲突读取位置(指针到字符串数组)