为什么在按值传递指针之后再按引用传递指针会指向原始内存位置
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)
由于文件中的数据类型也是无符号字符,通常它只会更改指针内存地址(如果我使用的是getData)。然而,现在我希望这种情况不会发生,但它确实发生了。
例如,指针的原始存储器地址(&ptr)=0x000000000c840070,那么在wrap_getData函数内部,数据指针存储器地址(&ptr)是0x00000000002393e8,正如预期的那样,当指针被复制时,这是不同的。但是现在,当我通过引用实际的getData函数来传递这个指针时,内存地址(&ptr)再次为0x000000000c840070,这是我没有想到的,我希望它保持0x00000000002393e8,因为副本是通过引用传递的。为什么会发生这种情况?
您传入了指针。在函数中,创建了一个新的指针,但指针指向同一对象。通过指针,该对象(指针指向的对象)能够在函数中更改。在函数之后,使用该函数创建的指针被销毁/释放。原始指针的内存位置一直保持不变,与指针指向的值相同。
我就是这么想的。我可能读得太快了。
在调用getData(fileName, data);
之前,指针data
例如位于地址"a_17"上,其值例如为"v_22",在调用函数时,会创建函数参数T*& data
,并获得与参数data
相同的值。所以它得到一个新地址(例如"a34"),它的值是"v22"。
如果您想用函数更改指针指向的位置,只需将指针传递给指针即可。
编辑:添加的图形:链接这就是我的看法。我承认我对函数参数中的"*&"是新手,我更喜欢使用指针和指针对指针。
这是偶然的。如果删除一个数组,然后立即创建一个大小完全相同的新数组,则使用相同内存地址的可能性很高。另一种行为是正常的。
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++指针无法更改其原始值
- 为包含原始指针的对象C++智能指针
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上