我正在使用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,因为副本是通过引用传递的。为什么会这样?
答案 0 :(得分:0)
这就是我的想法。我可能读得太快了。
在调用getData(fileName, data);
指针data
之前,例如在地址“a_17”上,并且它的值是例如“v_22”,在调用该函数时,函数参数T*& data
被创建并且获得与参数data
相同的值。所以它得到一个新地址(例如“a_34”),它的值是“v_22”。
如果要更改指针指向函数的位置,只需传入指向指针的指针。
编辑:添加图纸: link这就是我看到的。我承认我是这个“*&amp;”的新手在函数参数中,我更喜欢使用指针和指针指针。
答案 1 :(得分:0)
这是偶然的。如果删除一个数组,然后立即创建一个大小完全相同的数组,则机会很高,它将使用相同的内存地址。其他行为是正常的。