[英]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
执行此操作。
但是当我在main中执行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;
}
注意,它传递了对指针的引用,因此被调用者可以更新指针的值。
您在main()
someType *var
是main()
局部变量,而函数中的*var
是该函数的局部变量。
因此,函数中的var
指向var2
而不是main中存在的那个。
您正在按值传递var
。 这意味着在堆栈上制作了一个var
副本,与main中的var
分开。 然后使用var2
初始化此副本。 但是,当some_func
退出时,将弹出堆栈,并且副本将丢失。 main中声明的var
保持不变。
要解决此问题,一种可能的方法是让some_func
返回一个指针值,然后可以将其分配给var
。
或者,将您的some_func
声明更改为
void some_func(some_type *& var)
这通过var
参考,这意味着,所有你关心的var
在some_func
是一样的var
在main
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.