如何使用不同的指针算术语义
How to use different pointer arithmetic semantics
出于学术目的,我试图有目的地覆盖在免费商店中分配的数据。这是我到目前为止工作的工作:
//main
int* val = new int(-1);
print_bits(*val);
short* i = new(val) short(0);
print_bits(*val);
std::cout << "nval loc: " << val <<
"ni loc: " << i << std::endl;
delete val;
//end main
正如预期的,这会产生类似于:
11111111111111111111111111111111
00000000000000001111111111111111
val loc: 0x27d5580
i loc: 0x27d5580
我的下一个意图是覆盖val中的第二个字节,因此我只是将简短的分配更改为:
short* i = new(val+1) short(0);
但是,在进行此更改之后,我得到了类似的输出,例如:
11111111111111111111111111111111
11111111111111111111111111111111
val loc: 0x27d5580
i loc: 0x27d5584
您可以看到,val 1将指针移动一个全尺寸(int)字节向前,而不仅仅是一个字节向前。我了解为什么会发生这种情况(并为此表示感谢)。但是,如果我的意图是在内存中向前移动一个字节,我该怎么做?
编辑:
我想出的一种解决方案是做
之类的事情char* ch = &val;
short i = new(ch+1) short(0);
我实际上还不完全确定这是否会起作用,因为Char*的习惯是被解释为C风格的字符串。
解决方案:
给出的最简单解决方案是写
short* i = new(reinterpret_cast<char*>(val)+1) short(0);
只需写
short* i = new(( char * )val + sizeof( short )) short(0);
或
short* i = new(reinterpret_cast<char *>( val ) + sizeof( short )) short(0);
a short
不会是一个字节,并且通过一个字节存储在一个字节偏移量可能既可能违反对齐要求,又可能会存储超出原始分配长度的空间(取决于short
与int
的大小)。
要按单个字节"移动",您需要使用char *
类型。简单:
*(reinterpret_cast<char*>(val)+1) = 0;
...应该工作。
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 在C++17中,引用const字符串的语义应该是什么
- Xcode 语义问题引用或以前定义的代码
- 使用移动和复制语义时函数匹配如何工作?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 临时对象:术语澄清
- 在C++中使用移动语义的正确方法是什么?
- 有人能解释一下这些编程术语吗:引用语义,非线性可变状态