- 1 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:56:37 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/ スレを勃てるまでもないC/C++の質問はここで 5 pc11.2ch.net/test/read.cgi/tech/1230516307/ スレを勃てるまでもないC/C++の質問はここで 6 pc11.2ch.net/test/read.cgi/tech/1231564903/ スレを勃てるまでもないC/C++の質問はここで 7 pc11.2ch.net/test/read.cgi/tech/1232983248/ スレを勃てるまでもないC/C++の質問はここで 8 pc12.2ch.net/test/read.cgi/tech/1235921779/ スレを勃てるまでもないC/C++の質問はここで 9 pc12.2ch.net/test/read.cgi/tech/1240022781/ スレを勃てるまでもないC/C++の質問はここで 10 pc12.2ch.net/test/read.cgi/tech/1242300936/ スレを勃てるまでもないC/C++の質問はここで 11 pc12.2ch.net/test/read.cgi/tech/1245059383/ スレを勃てるまでもないC/C++の質問はここで 12 pc12.2ch.net/test/read.cgi/tech/1248010352/
- 29 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 13:31:31 ]
- coutが先にデストラクトされてしまうとか?
グローバル変数のデストラクト順ってどうなってたっけ・・・
- 30 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 13:32:48 ]
- 神の味噌汁
- 31 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 13:36:17 ]
- なぜかワロタw
- 32 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 13:41:51 ]
- シングルトンよりカウンタ使って例外飛ばす方がクール
- 33 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 14:53:46 ]
- クールミントガム
- 34 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 03:35:03 ]
- C++にあってCに無い物の代表格として「参照渡し」が挙げられるわけだけど
書籍によるとC++の参照渡しは、特に呼び出し側が値渡ししてるのか参照渡し してるのか見分けにくいことから参照渡しを多用することは慎むよう助言されている。 となるとC++ではいったいどういう風に”ポインタの値渡し”と”参照渡し”を使い分けるべきなんだろう? まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど 果たしてそれで正しいと思う?
- 35 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 04:14:43 ]
- const参照渡し以外はポインタの値渡しで
- 36 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 04:45:11 ]
- >>35
> const参照渡し これはなぜ参照渡しする必要があるの?
- 37 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:14:33 ]
- プロジェクトによる
- 38 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:49:00 ]
- >>34
>まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど >果たしてそれで正しいと思う? その書籍にはどういうときに参照渡しを使うのか書いてないの? ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。
- 39 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:14:40 ]
- >>38
> その書籍にはどういうときに参照渡しを使うのか書いてないの? > ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。 うん、参照渡しの多用は自重すべきとは書いてあるけど どういうときに参照渡しを使うべきかは詳しくは書かれてはいない(・ω・)
- 40 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:20:43 ]
- エディタが教えてくれるから別に混乱なんかしないだろ
- 41 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:21:04 ]
- >>39
> うん、参照渡しの多用は自重すべきとは書いてあるけど まさかconst参照渡しまで自重しろと書いてあるの? それなら・・・ よし! その本をまず窓から投げ捨てるんだ!
- 42 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:32:29 ]
- >>41
言われてみればconst参照渡しはシレっと紹介されていた気がする。 なんか重要なの?>const参照渡し
- 43 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:36:52 ]
- >>42
const参照渡しは革命的に便利。 便利というか効率という点でもその他の意味でも必須。 残念ながら語りきれる気がしない。 >const参照渡しはシレっと紹介されていた気がする。 その本は本当にC++の本なのか!? 本気で捨てろと言いたくなった本はそれが初めてだ。
- 44 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:56:25 ]
- その”const参照渡し”ってのは単に”ポインタ値渡し”に置き換えることはできないの?
- 45 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:58:19 ]
- >>42
この程度のことはググればすぐに分かるから自分で調べろ。
- 46 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 15:19:48 ]
- >>44
考え方が根本的に間違ってるよ。 ポインタ渡しは危険でバグの巣窟として有名。 この危険なコードを書かないように導入されたのが参照渡し。 ちなみにオブジェクトを最も安全に引数に渡せるのが「const付き参照渡し」なのでかなり重要です。
- 47 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 14:03:59 ]
- namespace
{ class kuzu { public: void muooon(void); }; } void kuzu::muooon(void) { } ↑これって定義の方にnamespaceつけなくてもそのファイル限定になる?
- 48 名前:デフォルトの名無しさん [2009/12/23(水) 07:37:49 ]
- ・・・
- 49 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 10:41:59 ]
- なる
- 50 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 12:52:02 ]
- >>42
オブジェクトを渡すときはほとんどconst参照渡し。速いし安全。 渡したオブジェクトを変更したいときだけ非const参照渡しだね。 const参照渡しを主にして、非const参照渡しを控えるのならまだわかるけど。const参照渡しの説明が少ないのは理解しがたいな。 >>44 参照はポインターに比べて安全に使用できる。 void func2(const int& d) { } void func() { int a; { int& b=a; //OK int& c; //エラー func2(a); //ok } } 参照は以上の例のように、初期化が必須なので参照先があることが文法上保障され、実体と区別なく安全に使える。 さらにスコープによって寿命が実体a>参照b>参照dになることが文法上保障されるから安全に使用できる。これは参照渡しでも同様。 だけど、この文法上の保障もポインタと併用すると安全性をぶち壊す危険な抜け道コードがいくらでも書ける。 これが文法上で危険性を排除できる参照と、自由だけど自己責任なポインタの大きな違いだと思うよ。
- 51 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:31:51 ]
- int& i = *(int*)NULL; // おk
- 52 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:29:05 ]
- >>50
それでも俺はint型といったオブジェクトではない変数はC++であっても参照ではなく ポインタで渡すべきだと思う。ポインタが危険とはいえプログラムの可読性はあきらかに ポインタ>参照 だ。 一方クラスといったオブジェクトはconst参照渡しを強く推奨する。 オブジェクトを渡すときはconst参照で渡すものという暗黙の了解が広く普及しているだろうし。
- 53 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:28:49 ]
- ポインタが*iじゃなくてiでアクセスできる文法ならそれでよかった
- 54 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 19:17:47 ]
- 結局のところ可読性と安全性・最適化のどっちを犠牲にするかだな
関数名とか文脈でだいたいわかるから俺は参照使うけど
- 55 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 20:33:05 ]
- >>54
> 関数名とか文脈でだいたいわかるから それが我流プログラミングの始まりですわな(´・ω・`)
- 56 名前:43 mailto:sage [2009/12/23(水) 23:38:25 ]
- >>43移行まじめに読んでないけど横槍レスしていいすか?
> ポインタが危険とはいえプログラムの可読性はあきらかに > ポインタ>参照 明らかと言っていいかどうか分からんが、 思う思わないはまあ宗教論争だしなぁ。 ・・・あとテンプレートが大好きな俺としては参照じゃないと気持ち悪くて仕方ない。
- 57 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:26:52 ]
- >>52
intは値渡しだね。
- 58 名前:デフォルトの名無しさん [2009/12/24(木) 06:16:24 ]
- intをアドレス渡し(ポインタ渡し)や参照渡しするやつは何を考えてのことだろうか…?
コピー渡し(値渡し)の一択だろ
- 59 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 10:12:49 ]
- >>58
無知が迷い込んで来たがな(´・ω・`)
- 60 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 14:51:09 ]
- WindowsAPIが混じっているのですがご了承ください。
以下、strの宣言が悪いといってコンパイルエラーになります。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: HDC hdc; PAINTSTRUCT paint; char *str = "猫でもわかるプログラミング"; hdc = BeginPaint(hWnd, &paint); TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str)); EndPaint(hWnd, &paint); break; 以下のように、{を追加するとエラーが出なくなります。どうして{が必要なのでしょうか? LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { ←★追加 HDC hdc; PAINTSTRUCT paint; char *str = "猫でもわかるプログラミング"; hdc = BeginPaint(hWnd, &paint); TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str)); EndPaint(hWnd, &paint); break; } ←★追加
- 61 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 14:55:48 ]
- cはスコープの頭じゃないと変数を作れないのさ!
- 62 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:38:43 ]
- >>61
> cはスコープの頭じゃないと変数を作れないのさ! あ〜、初心者がよくやる間違いだよなw なんであんなへんてこな仕様にしたんだろう>変数の宣言場所は先頭部分のみ
- 63 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:40:54 ]
- switch (x) {
case A: int z; //... case B: // いつのまにかzがあるぞ } C++でも case B に突入すること考えて文句が出るはず
- 64 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:46:14 ]
- >>60
コンパイラは何を使ってるの? 言語はC?C++? エラー内容は? VC++2008EEで試してみたけどコンパイルエラーは出なかったよ。
- 65 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 15:55:30 ]
- ウィンドウプロシージャなんだから省略した部分にcaseがずらずら書いてあると見るべきだろう。
>>60 C2360をググれ
- 66 名前:デフォルトの名無しさん [2009/12/24(木) 16:50:07 ]
- C++ってライブラリ豊富なの?特に文字列かんれん
- 67 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:54:32 ]
- 最悪だ
- 68 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 17:31:48 ]
- boostまで使えば
- 69 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 17:51:07 ]
- ど素人です。
oracleと接続してデータ取りたいのですが、 以下のソースで実行したところ途中までしかデータがとれません。 ※300000件中、16000件ちょいでデータがきれてしまう 何が原因かわかりますでしょうか? 切り貼りしたソースが足りなかったらすみません。 EXEC SQL OPEN CUR1; EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { EXEC SQL FETCH CUR1 INTO :item_data; rows = sqlca.sqlerrd[2]; } rows = sqlca.sqlerrd[2]; for (i=0;i<rows;i++) { printf("%d\n", item_data[i].item_seqno, ); } EXEC SQL CLOSE CUR1;
- 70 名前:69 [2009/12/24(木) 17:53:50 ]
- 環境書くの忘れてました。
SunOS 5.6 Oracle 8.1.6 CCコンパイラ です。
- 71 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 18:21:37 ]
- あー Oracle スレ落ちてんのか。それにしても C/C++ の話じゃねぇな。
>EXEC SQL FETCH CUR1 INTO :item_data; 構造体の配列らしいが、なんで上書きしてんの?
- 72 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 20:20:47 ]
- template<typename T> struct Base
{ typedef T type; }; /* ○VC9/×GCC */ template<typename T> struct Derived : public Base<T> { typedef type type; }; /* ○VC9/○GCC */ template<typename T> struct Derived2 : public Base<T> { typedef typename Base<T>::type type; }; 前者の記法は非標準なのでしょうか?
- 73 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 20:46:01 ]
- >>57
> intは値渡しだね。 intを参照渡し、ポインタ渡しする人っている? そういうときはreturnで返すのが常套じゃね? 複数のint型変数を返すときはint型配列のポインタ渡しか参照渡しするか、 そうでなければ構造体の参照渡しかポイント渡しにするのがセオリーじゃないの?
- 74 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 20:57:08 ]
- >>66
豊富とは決して言えない 特に標準ライブラリは発狂物ww でもboostを筆頭とする各種無償ライブラリとか 商用ライブラリとかまで含めれば豊富と言っていいとは思う。
- 75 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 00:23:38 ]
- CやってからC++のstring比べれば天国だろ。
- 76 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 01:48:11 ]
- >>66
初めからなんでも用意してある環境が欲しいなら、C/C++はおすすめできない。
- 77 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:08:41 ]
- C++0xだと任意長テンプレートが組み込まれてるらしいですが、今はまだですよね
make_tupleのように任意長のテンプレートはどうやって作ってるんでしょうか?
- 78 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:42:33 ]
- >>73
つ[配列にするほどでも、構造体にするほどでもないとき]
- 79 名前:74 mailto:sage [2009/12/25(金) 20:23:31 ]
- >>75
確かにCやってからのstd::stringには泣いた。
- 80 名前:デフォルトの名無しさん [2009/12/26(土) 18:57:20 ]
- ふーん
- 81 名前:74 mailto:sage [2009/12/26(土) 19:16:32 ]
- >>80
お前も俺達と一緒に泣けよ!
- 82 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:39:50 ]
- 文字列すべてに MFC の CString 使ってるバカの所為で
Linux への移植が大変だった、って意味では俺も泣いていいかな。
- 83 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:44:00 ]
- CString作っちゃえ
- 84 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:57:43 ]
- >>82
まて、そんなMFCのCStringだなんてクソと一緒にするな。 std::stringで書いてあればその苦労は全く無かったはずだ。全く。
- 85 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:47:25 ]
- ちょいと相談。
template<class T>class Settings { // }; struct Arecord { // }; class Asettings : Settings<Arecord> { // }; こんなクラス構造があると思いねぇ。勿論、Aの他にもBやCもある。 んでもって、一々Arecordとするのも業腹だから class Asettingsの中でstruct Record としてしまいたいってわけだ。 するってぇと、定義の順番の都合で巧くコンパイルできねぇ。 どうしたもんかね、こりゃ。
- 86 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 11:56:31 ]
- >>85
class Asettings が何か分からないから答えられぬ。
- 87 名前:86 mailto:sage [2009/12/29(火) 11:58:00 ]
- >>85
ごめんカンチガイした。 template<class T>class Settings { // }; struct Arecord; class Asettings : Settings<Arecord> { struct Arecord { // }; // }; これじゃだめなの?
- 88 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 13:09:02 ]
- >>87
ResTHX! それだとダメだった。 Arecordが::Arecordで宣言されて Asettings::Arecordで定義されるからだと思う。
- 89 名前:87 mailto:sage [2009/12/29(火) 16:10:09 ]
- >>88
> Arecordが::Arecordで宣言されて > Asettings::Arecordで定義されるからだと思う。 なるほど。たしかに。 Asettingsのクラス定義を分割できないって仕様がくせ者邪魔だなぁ。。
- 90 名前:87 mailto:sage [2009/12/29(火) 16:15:29 ]
- >>88
ttp://codepad.org/opJUGUor ここでは通ったけど 中身を実装するとやっぱダメっぽい?
- 91 名前:87 mailto:sage [2009/12/29(火) 16:17:33 ]
- >>88
ttp://codepad.org/YBqmrMtV こんなんも通ったよ。
- 92 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 17:13:14 ]
- >>91
残念ながら、これでアウト。外のArecordと内のArecordは別物なのよね。 ttp://codepad.org/eEpbQXgN
- 93 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 17:32:18 ]
- >>92
codepadでは確かに通らないが、 それはg++が古いからでは? 俺の g++ (TDM-2 mingw32) 4.4.1 および Comeauの www.comeaucomputing.com/tryitout/ このサイトでは通ったよ。
- 94 名前:>87 >93 ◆Nsutagdmm. mailto:sage [2009/12/29(火) 17:47:01 ]
- ちなみに
VC++ 2008でもbcc5.5.1でも通ったよ。
- 95 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:03:57 ]
- うーむ。gcc3が通らないのが問題なのか。情報THX!
- 96 名前:87 ◆Nsutagdmm. mailto:sage [2009/12/29(火) 19:03:18 ]
- ttp://codepad.org/XX7ZGdkK
ちなみにこのソースはそちらの手元では通る?
- 97 名前:デフォルトの名無しさん [2009/12/30(水) 10:46:28 ]
- 私のコーディングスタイルって変ですか?
structが引数になるときは参照渡し、 classの時はポインタ渡し、 としているのですが、変ですか? struct Point; class Object; Point Add(const Point &p1, const Point &p2); shared_ptr<Object> Get(Object* base); って感じなんですが・・・(^^;)
- 98 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:49:31 ]
- 変です
- 99 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:51:43 ]
- そういう風に区別する必要性がないと思うよ。
ほとんどの場合参照で渡せば問題ないはず。 ポインタで渡すのは、nullの状態を作りたい場合くらいかな。
- 100 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:00:29 ]
- structもclassも基本的には同じものだからね
区別する方がおかしい structで書いたらダメ出しする老害は死ぬがいいよ
- 101 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:06:32 ]
- structで書いてダメ出しされたのかw
- 102 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:12:52 ]
- classはprivateがデフォルト、structはpublicがデフォルトなのが微妙な位置づけの違いだろうね。
個人的には、structはデーター構造作るときにアライン合わせるときとか、ただのメンバ変数の集合体を作るときだけとしている。 boostのソース読むときはclassとstructがごっちゃになってるので読みづらいな。明確な使い分けの無いほぼ同じ機能の構文が複数あるのは勘弁してほしいよ。
- 103 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:31:46 ]
- そんなんがC++にはいっぱいあるよな(笑)
俺もstructはメンバ変数やメンバ関数含めほぼ全部publicにしているよ。 (つまりPODとまでは行かないが相当小さい簡易的なもの。) 全部publicでも大きなものはclassとしている。 逆に一つでもprivateにしたい場合はかなりの割合でclassとしている。 要は、読み手の受ける印象の違いだろうけどさ。
- 104 名前:97 [2009/12/30(水) 11:53:59 ]
- わたしもstructはデータ、classはクラス(?)と扱うものとしてます・・・
なんかそっちのほうが個人的には読みやすいので (^^; あと、クラスに参照だと基底クラスにキャストすることはできるのかな、とか思って。 趣味グラマなんでそこらへんがよくわかんないですm(_ _)m
- 105 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 12:15:07 ]
- >>104
あー、まだその辺な訳ね。 ずいぶんと因果な言語を選んだね君(笑) > クラスに参照だと基底クラスにキャストすることはできるのか 正確にはキャストじゃなくて暗黙の型変換の話だよね? できます。 生ポインタで渡すのはあまり綺麗なスタイルではないことが多い。 (わざとポインタにすることもあるけど) C++例外処理プログラミング ttp://www.02.246.ne.jp/~torutk/cxx/exception/programming.html この辺も読んだ方が良いかも。
- 106 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 12:15:28 ]
- >>104 できるよ!!だから安心して参照を使ってね♥
- 107 名前:デフォルトの名無しさん [2009/12/30(水) 14:48:51 ]
- すごく基本的な質問ですが・・・
char **c = new char*[5]; と char *c[5]; って、どういう違いがあるんでしょうか? deleteはどっちの場合も必要?
- 108 名前:97 [2009/12/30(水) 14:52:20 ]
- レスありがとうございます♪
そういえば参照を使う時でもshared_ptrは値渡しでいいんですよね??
- 109 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:04:54 ]
- >>107
newとdeleteは1対1で対応するべきものです newが無いのにdeleteしていたり、newしているのにdeleteが無いのは、どこか間違っている可能性が高いです
- 110 名前:105 mailto:sage [2009/12/30(水) 15:05:06 ]
- >>108
値渡しじゃなくて、 「値渡しと同じ書き方」ね。 いいよ。 というかそれができるのが参照の利点なのさ。
- 111 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:05:53 ]
- >>107
まず > char *c = new char[5]; > と > char c[5]; で考えてはいかがですか?
- 112 名前:107 [2009/12/30(水) 15:31:31 ]
- 回答ありがとうございます。
char *c = new char[5]; と char c[5]; の場合は、後者には他の文字列ポインタを代入できないというくらいで 基本的には同じような扱い方でOKなんですよね? で、関数を抜けるときは前者のみdeleteが必要ということですよね? char **c = new char*[5]; と char *c[5]; の場合のnewとdeleteの対応ですが、 後者はポインタの配列になると思うのですが 各要素に個別にnewを使っていた場合は、 また個別にdeleteしていくしかないということになるんですか? 関数を抜けるときに配列自体が開放される(?)ので ついでに要素についても自動的に開放されるということはないのでしょうか?
- 113 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:32:20 ]
- 無いよ
- 114 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:40:03 ]
- std::string使え
- 115 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 16:05:48 ]
- >>112
前者に文字列ポインタを代入していいなんてどこに書いてあった? ここにそれを晒した上で窓から投げ捨てろ
- 116 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 16:39:41 ]
- >>112
配列のdeleteはdelete[]だから。 たとえば char* c=new char[5]; に対するデリートはdelete[] c;だよ。 個別というのが char* c[5]; c[0]=new char; という意味だったら、 delete c[0]は必要だから。 スコープから抜けるときに配列は消えるけど中身は消えないからね。 スマートポインタをぐぐると便利だよ。
- 117 名前:デフォルトの名無しさん [2009/12/30(水) 16:56:59 ]
- だれか絵を描いてうpしてやれ
- 118 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:06:25 ]
- > ついでに要素についても自動的に開放されるということはないのでしょうか?
そんな親切な言語じゃないところがC++のいいところであり悪い所でもある。
- 119 名前:107 [2009/12/30(水) 17:21:56 ]
- みなさんご回答ありがとうございます。
おかげさまで何となく理解できた気がします。 ポインタ関係はややこしいですね。 >>115 char *a = "abcd"; char b[5]; char *c = new char[5]; b = a; // エラー c = a; // 一応OK 上記のような意味で書いたのですが、用語の使い方を誤っていたかもしれません。
- 120 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:23:38 ]
- >c = a; // 一応OK
OKじゃねーよ。 newしたバッファはどっかいっちゃうぞ
- 121 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:26:18 ]
- 文法上は正しいが、やってはいけないことだな
- 122 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:33:35 ]
- ハッ!107はchar*はすべて文字列ポインタと呼んでるのか
そんな呼び方は窓から(ry
- 123 名前:111 mailto:sage [2009/12/30(水) 17:39:59 ]
- >>107はちゃんと一応OKって言っているじゃん。
確かに一応OKなんだよ。 リソースを開放する気がないんなら。 そういう嫌がらせプログラムを組みたくなったときに必要な知識だ。
- 124 名前:107 [2009/12/30(水) 17:51:20 ]
- 何度もすみません。
もう1点いいですか? char *b[5]; と char (*c)[5]; は別物になるんですか? どちらもポインタの配列なのではないかと思ったのですが、 入れ替えるとコンパイルが通らなくなるので・・・。 >>122 「文字列ポインタ」がまずかったですか?
- 125 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:58:15 ]
- >>124
前者はcharの*(ポインタ)が5個の配列 後者は、char が5個の配列の*(ポインタ)
- 126 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 18:52:27 ]
- まぁ、初心者が一度はドツボにはまるところだから仕方ない。
一度もはまらなかったらそれはそれで怖いし。
- 127 名前:107 [2009/12/30(水) 19:04:09 ]
- ありがとうございます。
なるほど、配列のポインタになってしまうんですね。 実験してみたところ、 char *(c[5]); だとポインタの配列で char (*c)[5]; だと配列のポインタという感じでした。 なんか直感と逆な感じがしますが・・・。
- 128 名前:111 mailto:sage [2009/12/30(水) 19:26:55 ]
- >>127
よし。 type ttp://wwws.kobe-c.ac.jp/deguchi/c/type.html 俺はこのページを紹介できる時を待っていたんだ(笑) とても分かりやすかったんで必見!!
- 129 名前:107 [2009/12/30(水) 20:44:54 ]
- とても有用なページを教えていただきありがとうございます。
つまり、char (*c)[5]; と宣言された変数cがあったとしたら、 そのcに対して (*c)[5] という操作をすれば char 型になるという意味なんですね。 ようやく飲み込めた気がします。 ですが、さらに疑問点が出て来ました(何度もすみません)。 1 : char (*a)[5]; // 配列のポインタ 2 : char *(b[5]); // ポインタの配列 3 : char c[5]; // 配列(のポインタ) 4 : char *d = "abcd"; // 配列のポインタ 5 : char **ea = a; // NG 6 : char **eb = b; // OK 7 : char **ec = &c; // NG 8 : char **ed = &d; // OK また気になって上記のような実験をしてみたのですが、 予想に反して結果がぜんぜん一致しません・・・。 5、6行目に関して: char **x; という形だけを見れば 配列のポインタでもポインタの配列でもいけそうな気がしますが、 この場合は特別にポインタの配列と決められているということなのでしょうか? 7、8行目に関して:どっちも同じだと思うのですが、何か違うのでしょうか? 何度も申し訳ありませんが、ご教示よろしくおねがいします。 結局、教えていただいたページをちゃんと理解できていないかもしれませんが・・・
|

|