アカウント名:
パスワード:
CもC++もそんなことはやってくれないよ?所有権はプログラマが自分で管理するか管理するためのコードを書く。これ基本。でないとメモリリークし放題。
new/deleteの多くがコンストラクタ/デストラクタに置き換えられます。
なんてことはないし、
これらを使うとnew/deleteの多くがコンストラクタ/デストラクタに置き換えられます。そしてコンストラクタは変数の宣言時、デストラクタは変数がスコープを抜けるときに自動的に実行されます。プログラマは適切なデータ型とスコープに注意することでメモリリークを防げます。
なんて、インスタ
「スマートポインタ」は言語仕様ではない。
元コメントは言語仕様がどうのとは言っていません。逆に「スマートポインタ」と明言しています。後から出てきて対象範囲を狭めるのはなぜですか? それにスマートポインタは標準C++ライブラリの一部です。
そう見えるようにクラスを組んであるだけであって、それはポインタじゃない。
そう、本来ポインタで表現することが苦しいものもCではポインタとして表されている。これこそ元コメントで「これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。」と言われていることです。tarosukeさんも理解してるじゃないですか。
さらに言えばnewの後にコンストラクタ、deleteの前にデストラクタ
Cならば文字列や配列といった「動的オブジェクトの所有権管理」がポインタを使用して必要となるが、C++ならばオブジェクトとして管理される例。
その例のstringやvectorの中身がオブジェクトとして管理されてるように見えるのか...俺には管理するためのインスタンスが生成/消滅するのに伴って実体の方のインスタンスをnew/deleteしているように見えるがな。 んじゃさ、その(どっちでもいいけど)messageを何か他のインスタンスへ引数として渡すことを考えてみてー。渡す先は今いる関数が戻っても生きてるし、その引数(あるいは少なくともそれと同値なモノ)を後々まで使うという条件でね。
ほんとーにコメント読まずにコメントしてるなー
俺には管理するためのインスタンスが生成/消滅するのに伴って実体の方のインスタンスをnew/deleteしているように見えるがな。
んじゃさ、その(どっちでもいいけど)messageを何か他のインスタンスへ引数として渡すことを考えてみてー。渡す先は今いる関数が戻っても生きてるし、その引数(あるいは少なくともそれと同値なモノ)を後々まで使うという条件でね。
messages.push_back( string( "Hello," ) );
vector<string> messages;{ string message( "Hello," ); messages.push_back( message ); // 何か他のインスタンスへ引数として渡す} // 渡す先は今いる関数が戻っても(関数ではないがブロックスコープを抜けている)...
C++でポインタじゃないから何?
どれも反論になってないよ。
そのパターンがすでに書かれていることも読み取れないレベルなんですね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds
まぁ、驚いたのは (スコア:0)
指摘されても問題が何か理解出来ていない編集にはビックリだな
Re: (スコア:2, 興味深い)
自分でプログラミングすることなんか全く無いんでしょうね。
Re: (スコア:1, すばらしい洞察)
ポインタがいまいち理解できない人には朗報だ。
Re: (スコア:0, すばらしい洞察)
それで正しいと思います。
Cのポインタは、
- スカラ値への参照
- 配列への参照
- 動的オブジェクトの所有権管理
- 反復子
これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。
私はC++使いなんですが、C++なら、状況によって参照やスマートポインタや反復子を使い分けるところです。
理解しようとするとかえって遠回りだと思います。
Re: (スコア:1, すばらしい洞察)
>動的オブジェクトの所有権管理
CもC++もそんなことはやってくれないよ?
所有権はプログラマが自分で管理するか管理するためのコードを書く。これ基本。でないとメモリリークし放題。
んとなー?抽象度の高い方から理解しようとするから理解できないんだよ。
ポインタを理解するにはメモリイメージを持つこと。これに尽きる。
Re: (スコア:1)
# さりげなく「スマートポインタ」と書かれているから。
これらを使うとnew/deleteの多くがコンストラクタ/デストラクタに置き換えられます。そしてコンストラクタは変数の宣言時、デストラクタは変数がスコープを抜けるときに自動的に実行されます。プログラマは適切なデータ型とスコープに注意することでメモリリークを防げます。
これらの長所・短所を理解した上で相手に対して「んんー?あんたホントにC++使い?」と発言されているのでしょうか?
Re: (スコア:0, フレームのもと)
さらに言えばnewの後にコンストラクタ、deleteの前にデストラクタが呼ばれるんであって、
なんてことはないし、
なんて、インスタ
Re: (スコア:1)
元コメントは言語仕様がどうのとは言っていません。逆に「スマートポインタ」と明言しています。後から出てきて対象範囲を狭めるのはなぜですか? それにスマートポインタは標準C++ライブラリの一部です。
そう、本来ポインタで表現することが苦しいものもCではポインタとして表されている。これこそ元コメントで「これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。」と言われていることです。tarosukeさんも理解してるじゃないですか。
Re: (スコア:1)
その例のstringやvectorの中身がオブジェクトとして管理されてるように見えるのか...俺には管理するためのインスタンスが生成/消滅するのに伴って実体の方のインスタンスをnew/deleteしているように見えるがな。
んじゃさ、その(どっちでもいいけど)messageを何か他のインスタンスへ引数として渡すことを考えてみてー。渡す先は今いる関数が戻っても生きてるし、その引数(あるいは少なくともそれと同値なモノ)を後々まで使うという条件でね。
Re:まぁ、驚いたのは (スコア:1)
元コメントで「スマートポインタ」と書かれているにもかかわらず、勝手に「スマートポインタはC++言語仕様ではない」とか言い出すし。言語仕様でないから何?
「C++なら、状況によって参照やスマートポインタや反復子を使い分けるところ」をCならポインタで実現せざるを得ないと書かれているのに、「「スマートポインタ」はただのクラスであってポインタなんかじゃない」とか言い出すし。C++でポインタじゃないから何? だれもスマートポインタがポインタかどうかの話はしてません。
どれも反論になってないよ。 だから何? 「メモリリークし放題」への反論なんだからメモリリークしなければそれで説明できている。単にtarosukeさんがC++のメモリリークのしない/しづらくできる一面を知らなかっただけでしょう。new/deleteがどうの「メモリリークし放題」なコードしか書けないんでしょ。 そのパターンがすでに書かれていることも読み取れないレベルなんですね。 vector<string>::push_back()関数にstringを渡してます。そしてstring消滅後にforループでこのstringを読み出してますよ? こうやって書いてあげないと読み取れないかな?
こんな程度の人が他人に対して「んんー?あんたホントにC++使い?」と言うのはどうかと思います。
Re:まぁ、驚いたのは (スコア:1)
誰かが用意してくれたライブラリにくるまってHowTo知識があれば満足だと言うなら、もう「迷惑だからC/C++はやめれ。Javaがお勧め」くらいしか言うことはないよ。