我有这样的功能
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
,并且我在var2
中手动克隆(将var
的每个数据复制到some_func
)时,我无法获得错误。
我的问题在哪里?我并不习惯指针和内存分配,但我认为两种方式都应该有效。我错了吗?
也许主要问题是当我在函数中使用new
分配指针,然后在指针的参数中保存其地址时,在函数完成时内存是否会被释放?
答案 0 :(得分:3)
您需要将定义更改为:
void some_func(some_type*& var)
{
// var will also be changed on the caller side
var = var2;
}
请注意,它传递了对指针的引用,因此被调用者可以更新指针的值。
答案 1 :(得分:1)
someType *var
中的main()
是main的本地,函数中的*var
是该函数的本地。
因此,函数中的var
指向var2
,但不指向main中的{{1}}。
答案 2 :(得分:1)
您按值传递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
相同。