c++ - 为什么两个指针具有相同的内存地址?
问题描述
#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 在 SubBlock 1 之后是 20 个字节。
这是否意味着即使我只有 100 个字节,我也可以通过放置 new 分配无限数量的指针?
如何确保 SubBlock6 将是 nullptr 或使用放置新的边界?
解决方案
为什么上面代码中的两个指针都有相同的地址?
Placement new 接受它将初始化正在创建的对象的确切地址。你通过相同的地址,你得到相同的地址。
这是否意味着即使我只有 100 个字节,我也可以通过放置 new 分配无限数量的指针?
不会。每个新展示位置都会重复使用存储空间。您当然可以无限次地重复使用存储空间,但您最多只能分配相同的 100 个字符。
如何确保 SubBlock6 将是 nullptr 或使用放置新的边界?
不可能。开始是为您提供有效的存储空间来放置新对象以创建对象。如果不这样做,则行为未定义。
最后,您无需为新的安置而烦恼。
char *SubBlock1 = MainBlock;
char *SubBlock2 = MainBlock + 20;
对缓冲区进行分区就好了。只需确保delete[]
仅将指针值存储在MainBlock
.
推荐阅读
- reactjs - 在客户端上为动态页面(使用 CDN 缓存时)执行 SSR 和水合单页应用程序是否有意义?
- bash - CURL 上传文件名中包含 UTF-8 字符(例如 ä、ö、ü)的文件
- nlp - 有哪些方法可以更好地控制 BERT 输出?在多标签文本分类任务中增加/减少某些单词的相关性
- kubernetes - Kubernetes 上的零停机更新。当有上传文件的请求时
- python - 检索预期的 str、字节或 os.PathLike 对象时出现问题,而不是加载图像时出现 dict 错误
- reactjs - openWeatherMap API 调用失败
- swift - 检测用户何时在文本字段中粘贴一些文本
- scala - 是否可以强制 UDF 在 spark 中按行顺序(按组)执行?
- node.js - express js 在 res.sendFile 上发送禁止的 403
- sql - 错误 SQL71501:视图:[dbo].[View_Engagements] 对对象 [dbo].[Engagements] 的引用未解析