[英]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.