为什么在通过值传递指针后将指针传递给原始内存位置?

时间:2015-03-23 16:56:42

标签: c++ pointers pass-by-reference pass-by-value

我正在使用SWIG在Python中包装一些C ++代码。我正在包装的C ++函数定义为:

template <typename T>
void getData(const std::string& fileName, T*& data);

数据作为对指针的引用传递,因为文件中的数据可以是与指针相同的类型,也可以是不同类型的数据。在前一种情况下,我们只是将指针替换为指向文件数据的指针,在后一种情况下,我们使用std :: copy将每个值转换为请求的类型。

现在我们回答我的问题,SWIG包装给了我以下功能:

void wrap_getData(const std::string& fileName, T* data) {
     getData(fileName, data);
}

这是使用:

unsigned char* data = new unsigned char[dataSizeInFile]
wrap_getData(fileName, data)

由于文件中的数据类型也是unsigned char,通常它只会更改指针内存地址(如果我使用的是getData)。但是,现在我希望这不会发生,但确实如此。

作为示例,指针(&amp; ptr)= 0x000000000c840070的原始内存地址,然后在wrap_getData函数内,数据指针存储器地址(&amp; ptr)是0x00000000002393e8,正如预期的那样,指针是复制。但是现在,当我通过引用实际的getData函数传递这个指针时,内存地址(&amp; ptr)再次是0x000000000c840070,我不指望,我希望它保持为0x00000000002393e8,因为副本是通过引用传递的。为什么会这样?

2 个答案:

答案 0 :(得分:0)

你传递了指针。在该函数中,创建了一个新指针,但显示给同一个对象。并且通过指针,该对象(指针指向的对象)能够在函数中进行更改。在该函数之后,使用该函数创建的指针被销毁/释放。原始指针的内存位置始终保持不变,与指针指向的值相同。

这就是我的想法。我可能读得太快了。

在调用getData(fileName, data);指针data之前,例如在地址“a_17”上,并且它的值是例如“v_22”,在调用该函数时,函数参数T*& data被创建并且获得与参数data相同的值。所以它得到一个新地址(例如“a_34”),它的值是“v_22”。

如果要更改指针指向函数的位置,只需传入指向指针的指针。

编辑:添加图纸: link这就是我看到的。我承认我是这个“*&amp;”的新手在函数参数中,我更喜欢使用指针和指针指针。

答案 1 :(得分:0)

这是偶然的。如果删除一个数组,然后立即创建一个大小完全相同的数组,则机会很高,它将使用相同的内存地址。其他行为是正常的。