关于c++中的指针
regarding pointers in c++
我有一个类似的函数
void some_func(some_type *var)
{
// do something a get a var2 of type some_type*
var = var2;
}
我主要有
some_type *var;
some_func(var);
print_var(var);
但是我在运行程序时遇到了分段错误。调试表明print_var
是问题所在,就好像var
没有值一样。var2
是使用new some_type
初始化的,所以我认为我不需要对var
执行此操作。
但当我在主var = new some_type
中,并且在some_func
中手动克隆(将var2
的每个数据复制到var
)时,我没有得到错误。
我的问题在哪里?我不太习惯指针和内存分配,但我认为这两种方式都应该有效。我错了吗?
也许主要的问题是,当我在函数中使用new
分配指针,然后将其地址保存在指针的参数中时,当函数完成时,内存会被释放吗?
您需要将定义更改为:
void some_func(some_type*& var)
{
// var will also be changed on the caller side
var = var2;
}
请注意,它传递了对指针的引用,以便被调用者可以更新指针的值。
您正在按值传递var
。这意味着var
的副本是在堆栈上制作的,主要与var
分离。然后使用var2
对该副本进行初始化。但是,当some_func
退出时,堆栈将弹出,并且副本将丢失。main中声明的var
保持不变。
要解决此问题,一种可能的方法是some_func
返回一个指针值,然后可以将其分配给var
。
或者,将您的some_func
声明更改为
void some_func(some_type *& var)
这通过引用传递了var
,这意味着,就您所关心的而言,some_func
中的var
与main
中的CCD24相同。
main()
中的someType *var
是main的本地*var
是该函数的本地。
因此,函数中的var
指向var2
,而不是主要存在的CCD_30。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错