CPP04 1.0
読み取り中…
検索中…
一致する文字列を見つけられません
ScopedPointer.hpp
[詳解]
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* ScopedPointer.hpp :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: kamitsui <kamitsui@student.42tokyo.jp> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2025/06/03 20:23:36 by kamitsui #+# #+# */
9/* Updated: 2025/06/03 20:56:25 by kamitsui ### ########.fr */
10/* */
11/* ************************************************************************** */
12
17#ifndef SCOPED_POINTER_HPP
18#define SCOPED_POINTER_HPP
19
20#include <iostream> // デバッグ出力用
21
22// テンプレートクラスとして定義
23template <typename T> class ScopedPointer {
24 private:
25 T *m_ptr; // 管理する生ポインタ
26
27 // コピーコンストラクタとコピー代入演算子を禁止
28 // これにより、所有権のコピーを防ぎ、二重解放を回避する
30 ScopedPointer &operator=(const ScopedPointer &);
31
32 public:
33 // コンストラクタ: 生ポインタを受け取り、所有権を持つ
34 explicit ScopedPointer(T *ptr = 0) : m_ptr(ptr) {
35 std::cout << "ScopedPointer(" << m_ptr << ") created." << std::endl; // デバッグ用
36 }
37
38 // デストラクタ: スコープを抜けるときに管理下のメモリを解放
40 std::cout << "ScopedPointer(" << m_ptr << ") destroyed. Deleting resource." << std::endl; // デバッグ用
41 delete m_ptr;
42 }
43
44 // 生ポインタへのアクセスを提供する
45 T *get() const { return m_ptr; }
46
47 // ポインタのように Dereference 演算子 (*) をオーバーロード
48 T &operator*() const {
49 // null ポインタの場合は未定義動作になるが、通常は呼び出し側でチェック
50 return *m_ptr;
51 }
52
53 // ポインタのように Member Access 演算子 (->) をオーバーロード
54 T *operator->() const {
55 // null ポインタの場合は未定義動作になるが、通常は呼び出し側でチェック
56 return m_ptr;
57 }
58
59 // 所有権を解放し、生ポインタを返す
60 // ポインタを受け取った側が解放の責任を持つ
61 T *release() {
62 T *temp = m_ptr;
63 m_ptr = 0; // null にする (デストラクタで delete しないように)
64 return temp;
65 }
66
67 // 新しいポインタを割り当て直す(以前のポインタは解放される)
68 void reset(T *ptr = 0) {
69 if (m_ptr != ptr) { // 同じポインタでないかチェック
70 delete m_ptr;
71 m_ptr = ptr;
72 }
73 }
74};
75
76#endif // SCOPED_POINTER_HPP
void reset(T *ptr=0)
T * get() const
T * operator->() const
T & operator*() const
ScopedPointer(T *ptr=0)
T endl(T... args)