关于c ++中的指针

时间:2013-08-03 01:14:04

标签: c++ pointers

我有这样的功能

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分配指针,然后在指针的参数中保存其地址时,在函数完成时内存是否会被释放?

3 个答案:

答案 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_funcvar中的main相同。