簡體   English   中英

刪除整數指針時析構函數末尾的分段錯誤

[英]segmentation fault at the end of the destructor on deleting integer pointer

我試圖理解以下程序。 執行過程中出現錯誤,如下所示。

#include<iostream>
using namespace std;
class Base
{
public:
    int *a;
    int a1;
    int b;


    Base(){
        cout<<"Inside Constructor"<<endl;
        a1 = 10;
        a = &a1;
        cout<<"   "<<a<<endl;
        b = 20;
    }

    Base(const Base &rhs)
    {
        cout<<"Inside Copy Constructor"<<endl;
        a = new int;
        *a = *(rhs.a);
        b = rhs.b;
    }

    ~Base(void)
    {
    cout<<"Inside destructor"<<endl;
    delete a;
    }
};


int main()
{
Base obj;
Base obj2(obj);
cout<<"obj a "<<*(obj.a)<<" b "<<obj.b<<endl;
cout<<"obj2 a "<<*(obj2.a)<<" b "<<obj2.b<<endl;
obj.a1 = 30;
obj.b = 40;
cout<<"obj a "<<*(obj.a)<<" b "<<obj.b<<endl;
cout<<"obj2 a "<<*(obj2.a)<<" b "<<obj2.b<<endl;
return 0;
}

在執行此代碼時,我得到以下輸出

Inside Constructor
Inside Copy Constructor
obj a 10 b 20
obj2 a 10 b 20
obj a 30 b 40
obj2 a 10 b 20
Inside destructor
Inside destructor
Segmentation fault

[編輯]我正在尋找一種方法來破壞我在復制構造函數中創建的堆內存。 那么在這里可以做什么呢? 請建議

[編輯]

delete應該僅用於使用new從堆分配的內存。

a1 = 10;
a = &a1;

在您的情況下,“ a”將內存地址保存在堆棧中。 因此,您不應該在該內存上調用delete。

您必須刪除以new (動態分配)獲得的內存,而不是自動存儲變量。

在復制構造函數中,您正在使用new運算符為指針a分配內存,因此您可以刪除它。但是由於u在默認構造函數中未使用new運算符 ,因此可以刪除指針a 您必須使用delete opearator釋放內存中不在堆棧中的變量的內存。

當您使用new運算符時 ,該變量將在堆中創建,而本地變量將在堆棧內存中創建,無法使用delete運算符將其刪除

問題不是復制構造函數,問題是您沒有一致地使用new (如果您使用move,那么您可能會有一點意思)。 您有一些選擇。 我試圖變得有用,而不是詳盡無遺,也許我想念其他好的設計思路。

始終(始終)使用new

您可以在所有構造函數中添加一個new,因此析構函數將始終能夠調用delete 即使您不需要它。 這可能是一個丑陋的hack,但是是一致的。

永遠不要使用new

如果您從不使用new ,那么您也將不使用delete ,並且編譯器將確保一致性並確保您不會搞亂。 通常,您可以依靠構造函數上的編譯器默認行為。

使用智能指針

如果不是將變量手動調用delete ,而是將變量保存在unique_ptr ,則編譯器會自動將其釋放到析構函數處。 智能指針足夠智能,可以知道它是否已初始化。

請注意,使用智能指針意味着您永遠不要調用delete ,因為如果您在沒有警告智能指針的情況下進行調用,那么您將偶然發現相同的問題。 如果您不熟悉它們,並且使用的是C ++ 11,那是一件好事:)

跟蹤指針的狀態

我不會為此提供擔保。 看起來非常C而不是C++ 但是,您始終可以跟蹤bool值並在銷毀時檢查它。 這就像使用智能指針一樣,但是具有內部實現。 我認為這是一個糟糕的設計思想,盡管在某些情況下具有教育意義。

暫無
暫無

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

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