C++ 在函数调用过程中,指针地址会稍微移动

C++ 在函数调用过程中,指针地址会稍微移动,c++,pointers,C++,Pointers,我的char*参数似乎正在更改地址,而我没有直接修改它。我在自定义deallocator中打印字符*的地址,然后立即在另一个函数中打印。我没有显式地对char*执行任何更改,但在两个记录的语句中,地址总是略有不同 以下是我的自定义deallocator的相关部分: template <std::size_t N, std::size_t MAX_SIZE, int ID, template <class Created> class MemPolicy>

我的
char*
参数似乎正在更改地址,而我没有直接修改它。我在
自定义deallocator
中打印
字符*
的地址,然后立即在另一个函数中打印。我没有显式地对
char*
执行任何更改,但在两个记录的语句中,地址总是略有不同

以下是我的自定义deallocator的相关部分:

    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);
...
}
值之间的差值通常在50到200之间(十进制)

以下是我尝试过的:

  • 声明addMemory以获取
    const char*
    而不是
    char*
    。这没有什么区别
  • 在deallocator中打印两次地址。在这种情况下,地址总是相同的。因此,移动指针的不是打印(为什么要移动?)
  • 在addMemory()调用后注释掉我的deallocator中的所有内容,以确保DealLocation函数中没有影响p的其他内容。这也没有什么区别

我还没有考虑到线程安全,因此我想知道由于STL实现细节,deallocator是否以线程方式调用(我的deallocator与
std::vector一起使用)。这就是为什么p在移动的可能性吗?我还应该检查什么?

是的,指针的地址正在更改(因为您正在打印名为
p
的不同变量的地址),但指针的值(即地址)没有更改

char*
虽然是指针,但它本身是通过值传递给函数的

您正在打印
&p
,它是指针的地址,而不是指针的值。您之所以看到它“四处移动”,是因为您正在不同函数的堆栈框架中打印不同局部变量(也称为
p
)的地址


如果打印
(void*)p
,您将看到其值(即地址)保持不变。

addMemory
函数中的
p
deallocate
中的函数是不同的
p
——它们有不同的地址,即使它们都指向相同的地址。

有两个名为
p
的变量,一个在
deallocate()
中,另一个在
addMemory()中
。虽然它们可能指向同一个内存位置,但它们是两个不同的变量,因此具有不同的地址

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

std::cout << "adding memory: " << (void*) p << std::endl;

代码>我是C++新手,有时怀疑我的语法。我确实是从打印p开始的,因为这似乎是最符合逻辑的,但对我来说,它实际上只打印一个空白。也许这取决于编译器?@sunny
char*
被I/O流对象专门处理;由于它通常在C中用作字符串类型,因此
ostream::operator>
char*
重载试图将其打印为C字符串。在打印之前,将其显式转换为
void*
,您将看到地址。
//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()
std::cout << "adding memory: " << (void*) p << std::endl;
std::cout << "adding memory: " << &p << std::endl;