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开始的,因为这似乎是最符合逻辑的,但对我来说,它实际上只打印一个空白。也许这取决于编译器?@sunnychar*
被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;