オブジェクトのライフタイム
オブジェクトが生成・破棄されるタイミングを理解します
「オブジェクトのライフタイム」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
オブジェクトが生成されるとき
オブジェクトのライフタイムは、記憶域が割り当てられ、コンストラクタの実行が完了した後に始まります。この時点から、オブジェクトを完全に使用できるようになります。
#include <iostream>
struct Widget {
Widget() { std::cout << "born\n"; }
};
int main() {
Widget w; // constructor runs here
}オブジェクトが破棄されるとき
ライフタイムはデストラクタが実行されると終了します。スタックオブジェクトの場合、これはスコープを閉じる中括弧の位置で起こります。
#include <iostream>
struct Widget {
~Widget() { std::cout << "dies\n"; }
};
int main() {
Widget w;
std::cout << "alive\n";
} // ~Widget runs here構築と破棄の順序
オブジェクトは構築された逆順に破棄されます。最後に構築されたオブジェクトが最初に破棄されます。
#include <iostream>
struct Tag {
int id;
Tag(int i) : id(i) { std::cout << "make " << id << "\n"; }
~Tag() { std::cout << "drop " << id << "\n"; }
};
int main() {
Tag a(1);
Tag b(2); // dropped before a
}自動(スタック)ライフタイム
自動オブジェクトは、それを囲むブロックの実行中だけ存続します。これは最も一般的で安全なライフタイムモデルです。
動的(ヒープ)ライフタイム
new で作成したヒープオブジェクトは、delete が呼び出されるまで存続します。ライフタイムはスコープではなく、あなたが管理します。
#include <iostream>
struct Widget {
~Widget() { std::cout << "dies\n"; }
};
int main() {
Widget* w = new Widget();
std::cout << "still alive\n";
delete w; // destructor runs here
}静的ライフタイム
static 記憶域を持つオブジェクトは、プログラム全体の実行中存続します。関数ローカルの static は、最初に使われたときに一度だけ構築されます。
#include <iostream>
int next() {
static int counter = 0; // built once
return ++counter;
}
int main() {
std::cout << next() << next() << next() << "\n";
}一時オブジェクト
式の中で作成された一時オブジェクトは通常、完全式の終わり(セミコロンの位置)で破棄されます。
#include <iostream>
#include <string>
int main() {
std::cout << (std::string("a") + "b") << "\n";
} // temporary string dies after this lineメンバーは本体より先に構築される
クラスのメンバーオブジェクトは、外側のオブジェクトのコンストラクタ本体が実行される前に構築され、デストラクタ本体の実行後に破棄されます。
#include <iostream>
#include <string>
struct Engine { Engine() { std::cout << "engine\n"; } };
struct Car {
Engine e;
Car() { std::cout << "car\n"; }
};
int main() { Car c; }const 参照によるライフタイムの延長
一時オブジェクトを const& に束縛すると、そのライフタイムが参照と同じ期間まで延長されます。これは便利なC++のルールです。
#include <iostream>
#include <string>
int main() {
const std::string& s = std::string("hi");
std::cout << s << "\n"; // s still valid
}ライフタイム終了後の使用
ライフタイムが終了した後にオブジェクトに触れると未定義動作になります。これは典型的なダングリング参照や解放後使用のバグです。
ライフタイムがRAIIを支える
ライフタイムの終了時にデストラクタが確実に実行されるため、C++ではリソースの後片付けをライフタイムに結び付けます。これがRAIIの基礎であり、次のコースで詳しく扱います。
理解度チェック
オブジェクトのライフタイムについての理解度を確認しましょう。
まとめ
オブジェクトのライフタイムは構築後に始まり、破棄によって終了することを学びました。自動オブジェクトはスコープに従い、動的オブジェクトは new/delete に従い、static オブジェクトはプログラム全体にわたって存続します。破棄は逆順に行われ、これがRAIIの基礎になります。
よくある質問
「オブジェクトのライフタイム」レッスンは無料ですか?
はい。「オブジェクトのライフタイム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「オブジェクトのライフタイム」で何を学びますか?
オブジェクトが生成・破棄されるタイミングを理解します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「オブジェクトのライフタイム」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スタック割り当て
- new/deleteによるヒープ割り当て
- オブジェクトのライフタイム
- よくあるメモリバグ