nativeの基礎知識 「ポインタ」てなによ!?

Slides:



Advertisements
Similar presentations
わんくま同盟 横浜勉強会 #1 - C++ Day Boost とその実装技術 ~ Boost の薄い話から濃い話まで~
Advertisements

プログラミング基礎I(再) 山元進.
~手続き指向からオブジェクト指向へ(Ⅰ)~
Ex7. Search for Vacuum Problem
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Ex8. Search for Vacuum Problem(2)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
アルゴリズムとデータ構造 2011年6月13日
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
アプレット プログラミング 第10回 アプレット プログラミング第10回.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
RMI ソフトウェア特論 第6回 /
~手続き指向からオブジェクト指向へ[Ⅱ]~
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
プログラミング 4 記憶の割り付け.
WinUnit お気楽お手軽 UnitTest
WinUnit お気楽お手軽 UnitTest
Collection, Generics, Iterator
TDDとメソッドの外部設計 テストファーストの秘訣 2009/08 biac.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
第7回課題 フィボナッチ数列 (コード:p.171) について,fib(4) を呼び出したときの起こる出来事は以下の通りである.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
一時的な型 長谷川啓
C++/CLI カクテル・レシピ episthmh (゚Д゚)ウマー Microsoft MVP, Visual C++
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
演習07-0 “Hello\n” “World!\n”と
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Boostのスマートなポインタを使ってみる
C#プログラミング実習 第3回.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2012年6月11日
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
サブゼミ第7回 実装編① オブジェクト型とキャスト.
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-3. サブクラス,継承 (C++ オブジェクト指向プログラミング入門)
cp-2. 属性,アクセサ (C++ オブジェクト指向プログラミング入門)
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
演習00-0 “Hello\n” “World!\n”と
ソフトウェア工学 知能情報学部 新田直也.
フレンド関数とフレンド演算子.
演算子のオーバーロード.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
値渡しと参照渡しについて.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
プログラミング 3 ポインタ(1).
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

nativeの基礎知識 「ポインタ」てなによ!? わんくま同盟茶藝部顧問 Minrosoct MVP for Visual C++ 2004- episthmh episteme@wankuma.com

「ポインタ」てなによ!? わかんなくていいです。 メンドクセーってことだけ   知ってください。

C#(てか.NET)には値型と参照型があります。 値型は struct / 参照型 は class naitiveの代表(?)C++には    型としての参照はありません。 あるのは値型のみ。class でさえも。

ポインタのつかいかた。 class Hoge { public: void func(); … }; int main() { Hoge* p = new Hoge(); p->func(); delete p; } Hoge型のポインタ p new で生成 メソッド呼び出し delete で廃棄/返却

ポインタ: 血の掟 借りたものは返せ .NET だと使わなくなったヤツはほっとけば勝手に回収してくれるんですけどねー

ポインタ: 掟を破ると なにが起こるか わからない 現象は、たいてい原因とは別のところに現れます。 ものすごく見つけにくい厄介なバグです。

int main() { Hoge* p; p = new Hoge(); … // いろいろあって } よくやる掟破り : 返し忘れ よくやる掟破り : 返し忘れ int main() { Hoge* p; p = new Hoge(); … // いろいろあって } Java/.NET 屋さんは delete を忘れます。

int main() { Hoge* p; p = new Hoge(); … // いろいろあって p = new Hoge(); … よくやる掟破り : 紛失 int main() { Hoge* p; p = new Hoge(); … // いろいろあって   p = new Hoge(); … delete p; } 最初に借りたHogeが迷子になってます。

よくやる掟破り : 返し過ぎ void f(Hoge* p) { // いろいろあって delete p; } int main() { よくやる掟破り : 返し過ぎ void f(Hoge* p) { // いろいろあって delete p; } int main() { Hoge* p; p = new Hoge(); f(p); mainの最後でもっぺんdeleteしちゃってます。

int main() { Hoge* p; p = new Hoge(); … // いろいろあって delete p; よくやる掟破り : 未練たらたら int main() { Hoge* p; p = new Hoge(); … // いろいろあって delete p; p->func(); } 返したからには使っちゃダメですよー。

p = new Hoge[10](); // 10個借りる p[10].func(); delete[] p; // まとめて返す } よくやる掟破り : 強欲 int main() { Hoge* p; p = new Hoge[10](); // 10個借りる p[10].func(); delete[] p; // まとめて返す } 使えるのはp[0]~p[9]の10個!

いちいち返さにゃならん。 必ず1回だけ。 0回でもダメ。2回でもダメ。 必ず1回だけ、 責任もって返さにゃならん。 めんどくせー最大の要因は 必ず1回だけ。   0回でもダメ。2回でもダメ。 必ず1回だけ、 責任もって返さにゃならん。 あまりにめんどくせーのでJava/.NETではdelete不要にしちゃいました。

int main() { Hoge* p; p = new Hoge(); Hoge* q = p; // ポインタのコピー 誰が返す!? int main() { Hoge* p; p = new Hoge(); Hoge* q = p; // ポインタのコピー p->func(); // delete p しちゃダメよね。 q->func(); delete q; } 最後に使った人が返します。

かしこいポインタ(のようなもの) template<T> class shared_ptr { T* body; int* owner; public: shared_ptr(T* p) { // コンストラクタ body = p; owner = new int; *owner = 1; } T* get() { return body; } … ownerは使ってる人の数。

かしこいポインタ(のようなもの) template<T> class shared_ptr { T* body; int* owner; public: ~shared_ptr() { // デストラクタ if ( --*owner == 0 ) { delete body; delete owner; } … 自分が最後の一人なら、返却します。

かしこいポインタ(のようなもの) template<T> class shared_ptr { T* body; int* owner; public: shared_ptr& operator=(const shared_ptr&) { // コピーされたら、元持ってたのを手放して     // 新たに持ち換える } … こんなのも実装せにゃなりません。

かしこいポインタ(のようなもの) int main() { shared_ptr<Hoge> p(new Hoge()); {   { shared_ptr<Hoge> q = p; // ここで利用者は二人。 q.get()->func(); } // qがいなくなって利用者は一人。 p.get()->func();   … } // pがいなくなって利用者は0。 自分が最後の一人なら、返却します。

かしこいポインタ(のようなもの) int main() { shared_ptr<Hoge> p(new Hoge()); shared_ptr<Hoge> q = p; // ここで利用者は二人。 p = shared_ptr<Hoge>(new Hoge()); // ポインタ持ち換え   p->func(); q->func(); … } こんなことも想定しないとね。

こんなの作れば、deleteしなくて済みます。 僕のおはなしはここまで。 こんなの作れば、deleteしなくて済みます。 さほどにめんどくさくないですね。 こんなのを 「参照カウンタ」 っていいます。 つづきはWebでとっちゃんが!