为什么两个指针都有相同的内存地址
Why do both pointers have the same memory address?
#include <iostream>
using namespace std;
int main()
{
char* MainBlock = new char[100];
char* SubBlock1 = new (MainBlock) char[20];
char* SubBlock2 = new (MainBlock) char [20];
cout << static_cast<void*>(SubBlock1) << " " << static_cast<void*>(SubBlock2);
}
为什么上面代码中的两个指针都有相同的地址?我期望SubBlock2在SubBlock1之后是20字节。
这是否意味着即使我只有100个字节,我也可以用新的位置分配无限数量的指针?
如何使用placementnew确保SubBlock6是nullptr或越界?
为什么上面代码中的两个指针都有相同的地址?
Placementnew接受它将初始化正在创建的对象的确切地址。你传递相同的地址,你得到相同的地址。
这是否意味着即使我只有100个字节,我也可以分配无限数量的带有新位置的指针?
否。每次新放置都会重复使用存储空间。当然,您可以无限次重复使用存储,但最多只能分配相同的100个字符。
如何使用placementnew确保SubBlock6是nullptr或越界?
没有办法。开始于您为新放置提供有效存储以创建对象。如果不这样做,则行为是未定义的。
最后,你不需要为新的职位而烦恼。
char *SubBlock1 = MainBlock;
char *SubBlock2 = MainBlock + 20;
分区缓冲区很好。只需确保对delete[]
只存储在MainBlock
中的指针值。
(MainBlock)
参数是放置参数。实际上,您明确地告诉程序在MainBlock
的地址分配SubBlock1
和SubBlock2
。
为了获得构造对象的地址,每个new
表达式都会调用相应的分配函数。一旦完成了分配并从分配函数返回了地址,它就会尝试在指定的地址处构造对象。
给定char* SubBlock1 = new (MainBlock) char[20];
,它调用以下分配函数:
void* operator new[]( std::size_t count, void* ptr );
由标准数组表单放置新表达式调用。标准库实现不执行任何操作,并返回未修改的ptr。
正如上面的文档所说,调用这个分配函数什么都不做,只会返回未经修改传递的地址。因此,这个新的表达正好在MainBlock
上构建了20个char
。这就是为什么SubBlock1
和SubBlock2
的地址相同的原因。
这是否意味着即使我只有100个字节,我也可以分配无限数量的带有新位置的指针?
否。请注意,分配和构造是两件不同的事情。在您的示例中,只分配一次内存,并在上面构造多次对象。因此,在分配的内存上构造的对象的布局取决于您。
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 如何读取特定地址的进程内存?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- LLVM 传递以在特定地址分配内存
- 无法将内存地址转换为值
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 获取 R 数据帧的内存地址
- 如何配置bazel以运行地址/内存清理器?
- 存储 std::list 元素的地址;内存
- 确定库的地址内存