これはおそらく基本的な質問であり、すでに尋ねられているかもしれません(例えば、ここ); まだ理解できていません。なので、質問させてください。
次の C++ クラスを考えてみましょう。
class Obj{
char* str;
public:
Obj(char* s){
str = s;
cout << str;
}
~Obj(){
cout << "Done!\n";
delete str; // See the comment of "Loki Astari" below on why this line of code is bad practice
}
};
次のコード スニペットの違いは何ですか。
Obj o1 ("Hi\n");
そして
Obj* o2 = new Obj("Hi\n");
前者はデストラクタを呼び出すのに、後者は( を明示的に呼び出さずにdelete
)デストラクタを呼び出しないのはなぜですか?
どちらが好ましいでしょうか?
ベストアンサー1
両者は異なることを行います。
最初はオブジェクトを作成し、自動保存期間。これは作成され、使用され、現在のブロック( )が終了するとスコープ外になります{ ... }
。これはオブジェクトを作成する最も簡単な方法であり、次のように書くのと同じです。int x = 0;
2番目は、動的保存期間そして、次の 2 つのことが可能になります。
オブジェクトの有効期間を細かく制御します。オブジェクトは自動的にスコープ外にならないため、キーワード
delete
;を使用して明示的に破棄する必要があります。オブジェクトの作成は実行時に行われるため、実行時にのみサイズがわかる配列を作成します。(ここでは動的配列の割り当ての詳細については説明しません。)
どちらも好ましいというわけではなく、どちらが最も適切であるかは、何をしているかによって異なります。
後者を使用する必要がない限り、前者を使用してください。
C++の本には、このことについてかなり詳しく書かれているはずです。もし持っていないなら、それ以上進まない何度も購入して読むまで、これらのいずれか。
元のコードは壊れています。それは、配列が存在しないdelete
からです。実際、char
new
何もない new
C スタイルの文字列ではありません。これは文字列リテラルから取得されます。delete
これはエラーです (ただし、コンパイル エラーは生成されませんが、実行時に予期しない動作が発生します)。
delete
通常、オブジェクトは、自身が行わなかったことを実行する責任を持つべきではありませんnew
。この動作は十分に文書化されている必要があります。この場合、ルールは完全に破られています。