这是相当牵强的,但以下代码是"安全的"(即保证不会导致分段错误):
std::vector<int> vec(1); // Ensures that &vec[0] is valid
vec.reserve(100);
memset(&vec[0], 0x123, sizeof(int)*100); // Safe?
Run Code Online (Sandbox Code Playgroud)
我意识到这很难看 - 我只想知道它是否技术上安全,而不是"漂亮".我猜它唯一的用法可能是忽略存储在给定索引之外的值.
注意!如何获取vector :: reserve()分配的缓冲区地址?涵盖相同的主题,但我更感兴趣的是,如果这是安全的,如果有这样的陷阱.
编辑:原代码是错误的,取代原来memcpy
用memset
.
Bo *_*son 17
不,这不安全.
在a之后reserve()
,保证向量不会在capacity()
到达之前重新分配存储.
然而,标准不说什么载体实现可以与之间的存储做size()
和capacity()
.也许它可以用于一些内部数据 - 谁知道?也许地址空间只是保留而没有映射到实际的RAM?
访问[0..size]之外的元素是未定义的行为.有可能是一些硬件检查.
归档时间: |
|
查看次数: |
1645 次 |
最近记录: |