函数调用期间指针地址略有变化

sun*_*nny -1 c++ pointers

我的char*参数似乎正在更改地址,而无需我直接修改它。char*我在 a 中打印两者的地址custom deallocator,然后立即在另一个函数中打印。我没有明确地对char*但两个记录的语句中的地址总是略有不同。

这是我的自定义解除分配器的相关部分:

    template <std::size_t N, std::size_t MAX_SIZE, int ID, template <class Created> class MemPolicy>
    void arena<N, MAX_SIZE, ID, MemPolicy>::deallocate(char* p, std::size_t n) 
    {
      std::cout << "inside arena deallocate p is " << &p << std::endl;
      std::cout << "inside arena deallocate n is " << n << std::endl;
      MemPolicy<char>::addMemory(p, n);
...
}
Run Code Online (Sandbox Code Playgroud)

这是无效的addMemory:

void addMemory(char* p, std::size_t n){
      std::cout << "adding memory: " << &p << std::endl;
      std::cout << "size is: " << n << std::endl;
    }
Run Code Online (Sandbox Code Playgroud)

当我打印出参数时,大小是相同的,但指针略有不同。这就是我所看到的,非常一致(不是确切的数字,但每次都有相似的不同):

//I expect these numbers to match exactly, but clearly they don't
inside arena deallocate p is 0x7ffc2dff8210 //inside deallocator
adding memory: 0x7ffc2dff81e0  //inside addMemory()
Run Code Online (Sandbox Code Playgroud)

值之间的差异通常在 50 到 200(十进制)之间变化。

这是我尝试过的:

  • 声明 addMemory 来const char*代替char*. 这没有什么区别。
  • 在释放器中打印地址两次。在这种情况下,地址始终相同。所以并不是打印移动了指针(为什么要移动指针呢?)
  • 在 addMemory() 调用之后注释掉我的释放器中的所有内容,以确保释放函数中没有其他东西影响 p。这也没有什么区别。

我在编码时没有考虑到线程安全,所以我想知道由于 STL 实现细节,解除分配器是否以线程方式调用(我的解除分配器与 a 一起使用std::vector)。这可能是 p 四处移动的原因吗?我还应该检查什么?

stj*_*stj 5

有两个名为 的变量p,一个 indeallocate()和一个 inaddMemory()。虽然它们可能指向相同的内存位置,但它们是两个不同的变量,因此它们具有不同的地址。

为了打印实际的指针值而不是指针地址,请执行以下操作:

std::cout << "adding memory: " << (void*) p << std::endl;
Run Code Online (Sandbox Code Playgroud)

而不是这个:

std::cout << "adding memory: " << &p << std::endl;
Run Code Online (Sandbox Code Playgroud)