0

我有这样的功能

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在 main 中进行操作并手动克隆(将每个数据复制var2var)中时some_func,我没有收到错误消息。

我的问题在哪里?我真的不习惯指针和内存分配的东西,但我认为这两种方式都应该有效。我错了吗?

也许主要问题是当我new在函数中分配一个指针,然后将它的地址保存在指针的参数中,当函数完成时内存是否会被释放?

4

3 回答 3

3

您需要将定义更改为:

    void some_func(some_type*& var)
    {
        // var will also be changed on the caller side
        var = var2; 
    }

请注意,它传递了对指针的引用,因此被调用者可以更新指针的值。

于 2013-08-03T01:21:24.723 回答
1

你是var按价值传递的。这意味着在堆栈上制作了一个副本,与in mainvar分开。var然后用 初始化这个副本var2。但是,当some_func退出时,堆栈被弹出,副本丢失。main 中的var声明保持不变。

要解决此问题,一种可能的方法是 forsome_func返回一个指针值,然后您可以将其分配给var.

或者,将您的声明更改some_func

void some_func(some_type *& var)

这通过var引用传递,这意味着,对于您所关心的,varin与insome_func相同。varmain

于 2013-08-03T01:26:54.993 回答
1

someType *var的 inmain()是 main 的本地函数,而*varin 函数是该函数的本地函数。

因此,varin 函数指向var2但不是 main 中存在的那个。

于 2013-08-03T01:23:01.713 回答