メンバーとして別のオブジェクトへのポインターを持つ型があります。オブジェクト(Demo)が作成されると、コンストラクタ内の他のオブジェクト(Property)が初期化されます。私はこれらのオブジェクトをたくさん持っている場合は、別のものにプロパティを変更するときにヒープスペースを無駄にしたくないので、setProperty
の初期化されたメモリを解放してから、デモのデコンストラクタで再度削除します。その点で何か違うものに設定されています。ただし、これによりコードがクラッシュします。 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;
}
「プロパティ」はどこで宣言されていますか?また、 'new'で作成されたものを解放するためにのみ' delete'を使います。 'main()'の 'p'はスタックに割り当てられているので、' Demo ::〜Demo() 'はスタック割り当てオブジェクトを効果的に削除します。これは未定義の動作です。 – cdhowie
これはコンパイルされていない( 'property'は存在しません)という事実の他に、ここではあまりにも多くの誤解があります。なぜあなたは最初に動的割り当てを使用して、祈っているのですか? –
あなたは[ルール3](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))に違反しています。あなたは '新しい。 –