[英]Why does passing a pointer by reference after passing it by value point to the original memory location?
我正在与SWIG合作,将一些C ++代码包装在Python中。 我包装的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)。 但是,现在我希望不会发生这种情况,但确实如此。
例如,指针的原始内存地址(&ptr)= 0x000000000c840070,然后在wrap_getData函数内部,数据指针的内存地址(&ptr)为0x00000000002393e8,正如预期的那样,当复制指针时,该地址也不同。 但是现在,当我通过引用将该指针传递给实际的getData函数时,内存地址(&ptr)再次为0x000000000c840070,这是我不希望的,我希望它保持为0x00000000002393e8,因为副本是通过引用传递的。 为什么会这样?
您传递了指针。 在该函数处,创建了一个新的指针,但显示到同一对象。 通过指针,可以在函数中更改该对象(指针指向的对象)。 在该函数之后,使用该函数创建的指针被销毁/释放。 原始指针的内存位置始终保持不变,与指针所指向的值相同。
那就是我所想的。 我可能已经读过你的问题太快了。
在调用getData(fileName, data);
指针data
例如在地址“ a_17”上,其值例如“ v_22”,在调用该函数时,将创建函数参数T*& data
,并获得与参数data
相同的值。 因此它将获得一个新地址(例如“ a_34”),其值为“ v_22”。
如果要使用函数更改指针指向的位置,只需将指针传递给指针即可。
编辑:添加了图纸: 链接,这就是我的看法。 我承认我对函数参数中的“ *&”不熟悉,我更喜欢使用指针和指向指针的指针。
这是偶然的。 如果删除数组,然后立即制作一个大小完全相同的新数组,则机会很大,它将使用相同的内存地址。 其他行为是正常的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.