函数调用期间指针地址略有移位

时间:2015-08-04 20:17:31

标签: c++ pointers

我的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之间变化(十进制)。

这是我尝试过的:

  • 声明addMemory取char*而不是std::vector。这没有什么区别。
  • 在解除分配器中将地址打印两次。在这种情况下,地址始终相同。所以这不是打印指针的移动(为什么要移动?)
  • 在addMemory()调用之后注释掉deallocator中的所有内容,以确保deallocating函数中没有其他东西影响p。这也没有区别。

我没有记住线程安全性,因此我想知道是否由于STL实现细节而以线程方式调用deallocator(我的deallocator与$('form.form-quote').each(function(){ $(this).validate({ /* options */}); }); 一起使用)。这有可能导致p移动吗?我还应该检查什么?

3 个答案:

答案 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()函数中的paddMemory中的p不同{ - 1}} - 即使它们都指向同一地址,它们也有不同的地址。 / p>