[解決済み] オブジェクトの作成: `new` の有無 [重複].
質問
重複の可能性があります。
オブジェクトのインスタンス化をnewで行うか、newで行わないかの違いは何ですか?
これはおそらく基本的な質問であり、すでに質問されているかもしれません(例えば ここで のように)、しかし、私はまだそれを理解していないのです。そこで、質問させてください。
次のような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
)?
どれが好ましいですか?
どのように解決するのですか?
どちらも違うことをします。
一つ目はオブジェクトを
自動保存期間
. これは作成、使用され、そして現在のブロック (
{ ... }
)が終了した時点でスコープ外になります。これは、オブジェクトを作成する最も簡単な方法です。
int x = 0;
2つ目は、オブジェクトを 動的な保存期間 を作成し、2つのことを可能にします。
-
オブジェクトは自動的にスコープ外に出ないため、オブジェクトの寿命を細かく制御することができます。
delete
; -
オブジェクトの作成が実行時に行われるため、実行時にのみサイズがわかる配列を作成すること。(ここでは動的配列の割り当ての詳細については触れません)。
どちらが望ましいというわけではありません。どちらが最も適切かについては、あなたが何をしているかによります。
後者を使う必要がない限り、前者を使いましょう。
C++の本がこれをよくカバーしているはずです。持っていない場合は これ以上進めない を買って何度か読むまで、この先には進みません。 このうちの一つ .
頑張ってください。
あなたの元のコードは、次のように壊れています。
delete
は
char
という配列は
new
. 実際には
何も
new
C-styleの文字列は、文字列リテラルに由来しています。
delete
というのはエラーです(ただし、コンパイルエラーではなく、実行時に予測不可能な動作をするものです)。
通常、オブジェクトには
delete
の責任を負うべきではありません。
new
. この動作は十分に文書化されるべきです。この場合、そのルールは完全に破られています。
関連
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み] Pythonのオブジェクトを正しくクリーンアップするにはどうしたらいいですか?
-
[解決済み] 配置換え」にはどんな使い方があるのか?
-
[解決済み] JavaScriptで{}またはnew Object()で空のオブジェクトを作成しますか?
-
[解決済み] "new "の代わりに "Object.create "を使用する。
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み] JavaScriptのプロトタイプ継承を理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません