我的char*
参数似乎在更改地址而不直接修改它。我在char*
中打印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);
...
}
上明确执行任何更改,但在两个记录的语句中地址总是略有不同。
这是相关部分中的自定义解除分配器:
void addMemory(char* p, std::size_t n){
std::cout << "adding memory: " << &p << std::endl;
std::cout << "size is: " << n << std::endl;
}
这是void addMemory:
//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()
当我打印出参数时,大小相同,但指针略有不同。这就是我所看到的,非常一致(不是确切的数字,但每次都有类似的不同):
const char*
值之间的差异通常在50到200之间变化(十进制)。
这是我尝试过的:
char*
而不是std::vector
。这没有什么区别。我没有记住线程安全性,因此我想知道是否由于STL实现细节而以线程方式调用deallocator(我的deallocator与$('form.form-quote').each(function(){
$(this).validate({ /* options */});
});
一起使用)。这有可能导致p移动吗?我还应该检查什么?
答案 0 :(得分:4)
有两个名为p
的变量,一个在deallocate()
,一个在addMemory()
。虽然它们可能指向相同的内存位置,但它们是两个不同的变量,因此它们具有不同的地址。
要打印实际指针值而不是指针地址,请执行以下操作:
std::cout << "adding memory: " << (void*) p << std::endl;
而不是:
std::cout << "adding memory: " << &p << std::endl;
答案 1 :(得分:2)
是的,指针的地址正在改变,(因为您打印的是名为db
的不同变量的地址),但值(地址)没有改变。
p
虽然它是一个指针,但本身是通过值传递给你的函数的。
您正在打印char *
,这是指针的地址,而不是其值。你看到它“移动”的原因是你在不同功能的堆栈框架中打印不同的局部变量(也称为&p
)的地址。
如果您打印p
,您会看到其值(地址)保持不变。
答案 2 :(得分:1)
geom_line()
函数中的p
与addMemory
中的p
不同{ - 1}} - 即使它们都指向同一地址,它们也有不同的地址。 / p>