簡體   English   中英

指針功能刪除? 和指向指針崩潰的指針(C ++)

[英]pointer function delete? and pointer to pointer crash (c++)

我是C ++的新手,我使用代碼塊

1 / 指向指針的指針

int **pp = new int*;
cout<<*pp<<endl;
{
    int *p = new int;
    pp = &p;
    cout<< *pp<<endl;

}

之后,如果我寫delete pp ,則顯示“ .exe停止工作”。 我猜這是因為我嘗試刪除它指向的引用,並且不允許這樣做。 我只是讓pp嗎? 我不能刪除它嗎? 如果我要創建許多指向指針的指針,是否不存在內存泄漏的風險?

1 / 指針功能刪除 我有:

int* fct_ptr(int &a, int &b)
{
    int* ptr=new int;
    if (a>b)
        ptr=&a;
    else
        ptr=&b;

    return ptr;
}

如何取消分配用於fct_ptr的指針? 編寫delete fct_ptr(int_value1, int_value2)足夠? 但是我懷疑我的fct_ptr(int_value1, int_value2)只是一個指針,該指針通過fct_ptr(int_value1, int_value2)獲得了其參數的引用,例如int* a=new int; int*b=a; int* a=new int; int*b=a; ,所以這意味着無法以這種方式刪除ptr ...因此,如果我多次調用該fct,會不會發生內存泄漏? 我可以只寫int* ptr; 不是 int* ptr = new int*; 解決問題。 但是我想知道如何解決而不更改ptr的聲明

伯努瓦。

您只需要確保釋放分配給new所有內存,不必擔心指針本身。

因此,對於第一個代碼塊,當您重新分配pp您已經存在分配的pp一個對象的內存泄漏( new int* ),因為當您分配pp = &p ,您將永遠無法達到前一個內存對象*pp的內存地址。指向。

規則是,對於每個new ,必須有一個delete 因此,如果您真的想用T* p = new T進行聲明,則需要輸入

    int **pp = new int*; //(1)
    {
      int *p = new int; //(2)
      delete pp; //make sure (1) is deallocated, will never be reached otherwise
      pp = &p;
      delete p; //make sure (2) is deallocated, will never be reached otherwise
    }

對於(2),變量p僅存在於作用域中,並且只能通過它到達(2),因此您也需要在范圍中將其刪除。 如評論中所述, pp現在指向未定義的內容。

對於第二種情況,每次調用函數fct_ptr ,都在堆棧上分配一個永遠不會被釋放的int 所以這里的解決方案也是

int* fct_ptr(int &a, int &b)
{
    int* ptr=new int;
    delete ptr;
    if (a>b)
        ptr=&a;
    else
        ptr=&b;

    return ptr;
}

不過,當然,也沒有必要為哪些指針指向如果你從來沒有使用該對象分配內存。 因此,只寫int* ptr; 如果您不打算取消引用ptr然后再確定它指向某物。

暫無
暫無

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

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