簡體   English   中英

關於C ++中的指針

[英]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 *varmain()局部變量,而函數中的*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參考,這意味着,所有你關心的varsome_func是一樣的varmain

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM