关于c++中的指针

regarding pointers in c++

本文关键字:指针 c++ 关于      更新时间:2023-10-16

我有一个类似的函数

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中的varmain中的CCD24相同。

main()中的someType *var是main的本地*var是该函数的本地。

因此,函数中的var指向var2,而不是主要存在的CCD_30。