我有一個類型,作爲成員指向另一個對象的指針。當創建對象(Demo)時,它將在構造函數中初始化另一個對象(Property)。我認爲如果我有很多這些對象,當我將屬性更改爲不同的東西時,我不想浪費堆空間,因此我將初始化的內存釋放到setProperty
中,然後在Demo的解構中再次刪除它,因爲它會已經被設定爲與此不同的東西。但是,這會導致代碼崩潰。爲什麼它在重置時重新分配property
會崩潰?C++如何刪除一個默認的對象成員,這是一個指針
class Property{ };
class Demo{
protected:
Property *property;
public:
Demo(){ property = new Property();};
void setProperty(Property *p){
delete property;
property = p;
};
~Demo(){
delete property;
};
};
int main(){
Property p = Property();
Demo * d = new Demo();
d->setProperty(&p);
delete d;
}
甚至聲明'財產'在哪裏?此外,您只能使用'delete'來釋放使用'new'創建的東西。 'main()'中的'p'是堆棧分配的,所以'Demo ::〜Demo()'有效地刪除了一個堆棧分配的對象,這是一個未定義的行爲。 – cdhowie
除了這個甚至沒有編譯的事實(「屬性」不存在)之外,這裏有太多的誤解,我甚至不知道從哪裏開始。爲什麼你首先使用動態分配,祈禱告訴? –
您違反了[3條規則](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)),並且您試圖刪除未用' new'。 –