我的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(十进制)之间变化。
这是我尝试过的:
const char*代替char*. 这没有什么区别。我在编码时没有考虑到线程安全,所以我想知道由于 STL 实现细节,解除分配器是否以线程方式调用(我的解除分配器与 a 一起使用std::vector)。这可能是 p 四处移动的原因吗?我还应该检查什么?
有两个名为 的变量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)