C ++修改对象指针指向但不保留值

时间:2017-10-05 07:27:19

标签: c++ pointers reinterpret-cast

设置是我有一个对象,下面该对象是一个秘密指针。

此指针指向同一个类的对象,但与上面的对象不同。

我有一个函数,它接受顶层对象并使用指针算法来获取它下面的指针。

然后在这个函数里面我想修改秘密指针所指向的对象的值。

在调试中我可以看到函数中的值被修改得很好但是一旦函数返回值就不会被保留。

我对此感到困惑。

有什么想法吗?

此外,我拥有创建这些对象和指针的所有内存,所以我不认为任何堆问题应该发生,因为我正在做我自己的小内存管理器以获得乐趣。

我认为这个问题与我使用reinterpret_cast有关,如果我正确的解决方案/替代方案,为什么会出现这个问题呢?

void doWork(Obj* pObj) {
  // Get address of the object the pointer is pointing to 
  unsigned char* position = reinterpret_cast<unsigned char*>(pObj); 

  // 16 Bytes below the object is a secret pointer      
  position += (sizeof(Obj) + 16);

  // Retrieve the secret pointer 
  Obj* secretObj = reinterpret_cast<Obj*>(position);

  // Modify a value in that secret object
  secretObj->value += 1;
 }

我已经尝试过通过引用传递指针的建议,但仍然没有运气。

我很困惑为什么传入指针的方式甚至无关紧要,因为我只使用该指针来获取地址作为基础然后我去创建一个新指针用它重新解释(地址+ sizeof(Obj))并对新创建的指针进行处理。

2 个答案:

答案 0 :(得分:0)

这是因为您正在将指针传递给指针。 地址的地址,任何更改都将仅在函数范围内保存在本地。 要解决此问题,您应该通过引用传递指针。

void doWork(Obj *&amp; pObj)

这应该有用。

答案 1 :(得分:0)

(&(*pObj))是多余的。您正在获取刚刚取消引用的对象的地址。当然(&(*pObj)) == pObj

最可能的问题是您的偏移计算。您的计算会增加Obj和16的大小。我们无法从您的示例中判断这是否正确,因为您没有向我们提供Obj的详细信息或秘密指针的定义方式。如果此计算错误,则value的更新似乎在您的函数中有效但您更改了错误的字节,因此在函数外部看不到它。

相关问题