1 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 23:06:15.32 ID:HdItgJjm.net] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part121 peace.2ch.net/test/read.cgi/tech/1449240881/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 peace.2ch.net/test/read.cgi/tech/1439849418/ 次期規格C++1zはこちら C++14/C++1z 20 peace.2ch.net/test/read.cgi/tech/1410382924/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
792 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 12:50:15.26 ID:zKS/hYh5.net] >>786 なんか、応用の聞かない「メモリ不足対策」だね。 >>627 みたいな超簡単な悪役にも対応できないのか。 墓穴掘ってやがる。ゴミクズって本当にバカだな。
793 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 13:56:19.68 ID:7PDbXjKY.net] どうしてコテハンは慈演をつづけるの
794 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 13:59:03.92 ID:Th9NieDp.net] C言語の検索するとC++のことが出てきやがってマジで迷惑。 いい加減にしてほしい。
795 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 14:52:35.59 ID:e6sIQV8m.net] そんな794に訃報だ ハーブサッターはVisual C++がC99をサポートしない理由を訊かれて「しないからしない」的なアスペな回答をしている Cにしかない機能以外は対応するが、それ以外はCはC++のサブセットとしてC++を使えということだ
796 名前:デフォルトの名無しさん [2016/02/13(土) 15:12:53.44 ID:GG2kKfuP.net] >>774 >>776 >>777 >>778 ありがとうございます。 SendMessage(wh, WM_CHAR, 'A', 0); で出来ました。 つまり、SendMessage でWM_KEYDOWN は使えないということですね? 次のステップなのですが、 「右矢印キーを2回押す」や「ctrl+Sを押す」といった事は、 SendMessageで行えますか?PostMessageを使うしかないでしょうか? コード例以下です。 「右矢印キーを2回押す」 SendMessage(wh, WM_KEYUP, VK_RIGHT, 0); SendMessage(wh, WM_KEYUP, VK_RIGHT, 0); 「ctrl+Sを押す」 SendMessage(wh , WM_KEYDOWN , VK_CONTROL , 0); SendMessage(wh , WM_KEYDOWN , 'S' , 0); SendMessage(wh, WM_KEYUP, VK_CONTROL, 0); SendMessage(wh, WM_KEYUP, 'S', 0);
797 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 15:15:43.59 ID:jEq/NF/M.net] スレ違いをスルーせず中途半端に乗っかるからこうなる。誘導以外触れないほうがいい。
798 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 15:35:45.74 ID:QD8KbUeS.net] >>796 メモ帳立ち上げてkeybd_event()でやった方が早いぞ
799 名前:デフォルトの名無しさん [2016/02/13(土) 16:05:47.92 ID:GG2kKfuP.net] >>796 >>798 keybd_eventやSendInputは最前面ウィンドウに対する操作になってしまうので、 使えないです。 ※ウィンドウが最前面か否かに関わらず常に安定した操作を実現したいのです
800 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 17:09:11.77 ID:MXADxP3M.net] >>738 以後誰も>>589 にレスしてないのでレスすると 自分はあいぽんアプリ作りたくてXcode+Clang(とllvm gcc)使ってるよ ここはVCの独自仕様を嫌うコメが結構出るし、VCばっかりということはないはず 自分も以前はWin+VCばっかりだったけど、Clangやgccに移植していかに自分のコードが 独自仕様に頼ってたか思い知らされた・・・
801 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 17:36:13.24 ID:e6sIQV8m.net] >>589 そもそもコンパイラーを使っていない
802 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 17:50:22.29 ID:8c5F/b7w.net] C++erのスルースキルの無さは異常
803 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 18:13:39.59 ID:Th9NieDp.net] 馬鹿をV$に隔離するためには役立ってるんだからそこに触れるのは駄目。
804 名前:デフォルトの名無しさん [2016/02/13(土) 18:18:04.37 ID:UpZGp0t4.net] codepad.org/Vtcbp6N8 のコード、g++4.9.3でコンパイルすると main.o:main.cpp:(.rdata$.refptr._ZN4hogeILw65EE5valueE[.refptr._ZN4hogeILw65EE5valueE]+0x0): `hoge<(wchar_t)65>::value' に対する定義されていない参照です とエラーが出ます。 109行目をコメントアウトするとコンパイル出来ます。何故ですか
805 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 18:33:19.74 ID:mOEZHanV.net] >>804 あっさーとで落ちてるからなんかチョンボしてる。かな?
806 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 18:40:12.59 ID:jEq/NF/M.net] >>804 static const メンバ変数に初期化子をつけて宣言しても定義にはならないから。 面倒だが別途定義を書いておかないと、 const& に渡した場合などアドレスが必要になる ような使い方をした時点でそういうエラーが出ることがある。 9.4.2 [class.static.data] p3 https://www.google.co.jp/search?q=%22The+member+shall+still+be+defined%22&lr=lang_ja
807 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 19:52:01.47 ID:2d9oUeOe.net] えつ
808 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 20:26:47.13 ID:e6sIQV8m.net] const&はともかくアドレスを必要とする場合、 shallで要求されたことを満たしていないのでエラー等のメッセージを出す義務があるのではないだろうか 1.4 Implementation compliance p2
809 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 20:55:19.29 ID:ISK/9ZCR.net] 出ることがあると言うか、出さなきゃあかんよな。
810 名前:デフォルトの名無しさん mailto:sage [2016/02/13(土) 22:00:43.12 ID:5ubtGtDT.net] そんなバカな......
811 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 00:02:32.46 ID:M72BiSZl.net] >>810 疑問があるなら率直に書きなさいな。
812 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 00:09:59.23 ID:rASW1SI1.net] アスペに「何かしゃべれよ」とか拷問過ぎるw
813 名前:デフォルトの名無しさん [2016/02/14(日) 00:26:17.27 ID:YtvhXGz3.net] 俺に言わせるとそれほど難しいことじゃない
814 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 00:35:43.88 ID:qwowkzgX.net] >>811 >>806 に書いてある >static const メンバ変数に初期化子をつけて宣言しても定義にはならない のことだよ。 クラステンプレートの場合は、クラス内宣言が定義になるんじゃないの?
815 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 00:41:08.95 ID:YtvhXGz3.net] 最新の規格書読んだこと無い素人は回答を控えるように 無理して回答する必要ないから
816 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 01:45:35.51 ID:Ssn6bioA.net] よし最新の企画を読んだ俺が答えてやろう クラスとクラステンプレートで宣言と定義に大差は無い template<typename T> struct a { constexpr static int N = 0; }; template<typename T> constexpr int a<T>::N;//アドレスを要求される場合必要 int main(){ f(&a<int>::N); }
817 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 02:03:22.21 ID:2H7lNMsF.net] ×:企画 ○:規格
818 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 02:17:54.69 ID:Ssn6bioA.net] 大丈夫だ。最新の規格も読んだのでぬかりはない だが規格よりドラフトN4567の3.2 One definition ruleの方が近い例が書かれている
819 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 05:43:49.28 ID:trZrfj/6.net] 最新の規格ももちろん重要だが、C++は変化が激しいので C++14でこうなった(規格引用)、C++11ではこうだった(規格引用)、 みたいに紹介してくれると余計に有難い。 広く普及してる開発環境が最新規格に追いついてるとは限らないしね。
820 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 07:43:32.58 ID:Ssn6bioA.net] 大丈夫だ。規格は全版揃えているからぬかりはない 規格は>806の通りで最初からこの仕様はある C++98『The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition』 この時点でif it is usedが何を意味するのか説明が漏れていて(次の段落を読むと意図は想像できたが)、 C++11『if it is odr-used (3.2) in the program and the namespace scope definition』 と「odr-used」と言う言葉が導入された。これがリンカーの仕事が必要となるような使い方を意味する。 N4567では3.2のサンプルコードでstatic const int変数を const int &f(const int &r); に渡してodr-used here, so a definition is requiredとコメントが書かれている
821 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 08:59:22.24 ID:IJ2u9HkZ.net] ああっ!出る!!出るぞ!!ぴゅっぴゅっ …ふぅ、また>>815 の顔にかけてしまった
822 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 13:01:29.21 ID:H3NWVMks.net] >>815 が規格票の解釈を間違えているとしたら誰が指摘するのか
823 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 13:20:05.11 ID:+WF+5Yyl.net] クラステンプレートのstatic const整数型データメンバの定義を外側に書いたことはないな。 大昔は enum 使ってたし。
824 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 13:22:40.71 ID:YtvhXGz3.net] 変更か多い箇所だから、単に要求しただけだ。 PostMessageでメモリ状況の診断するような素人が紛れ込むと混乱するからね。
825 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 13:30:57.56 ID:jQtJnDco.net] XpでSendMeassageしまくると超もたつくというのはあるけど PostMessageでメモリの使用状況調べるのは初耳だな
826 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 14:10:17.13 ID:jkMZu/bi.net] >>822 規格を読んだ他の人が指摘するだけ。何を心配してる? >>815 はわざわざ検証しやすいよう検索結果を示してるし、 N4567は誰でもダウンロードできるし、 メイヤー先生の本にも書いてあることだし。
827 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 17:53:52.82 ID:M72BiSZl.net] >>820 お疲れ様、プロの規格読みの人。
828 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 18:18:09.59 ID:YtvhXGz3.net] >>825 今週来てなかったのか? ド素人の>>471 からの暴れっぷりを楽しんでくれ。
829 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 18:27:29.02 ID:/+rigQ84.net] >>471 PostMessageの挙動ってメモリアロケーションと無関係では? だとしても、確認のためにPostMessageをうつのかな
830 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 18:40:15.29 ID:KVV6N47s.net] おいやめろ。蒸し返すな。気になるならWin32APIスレに行け。
831 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 18:55:30.00 ID:2GOq4jA1.net] わざとやっているんだろう WIN32APIの仕様の話など、どうでもいいわ
832 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 19:02:17.52 ID:bGJc4W0W.net] なんかC++の質問しづらいね 本当に初歩的な質問なんですけど C++のThreadはWindowsじゃ使えないのでしょうか、それともgcc4.8.1のほうが悪いのでしょうか
833 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 19:05:42.38 ID:mwiD0ozs.net] 多分最終的な論点はそこじゃなくて なんでメモリが極限状態でOSのAPIが失敗するような状況下でも生き残らないといけないような 究極のログ取りアプリを作らないといけない時に、PostMessageなんか使ったのか、だろうな 彼はなにかメインスレッドに結果を伝えるためにPostMessageを使ったらしいが メモリ使用量調べてログファイルに書き出すだけの、メモリリークの証拠をつかむためだけの 使い捨てのアプリにサブスレッドなんかいるか? 適当なウエイトかけてループ回して、メモリ使用量取得して、ログファイルに書き出す これだけだろ 多少何か工夫するにしてもPostMessageの出番は無いように思うが 極限状態でも生き残らなきゃならないなら、なおさらのこと、余計な仕組みは要らないだろう ウィンドウも要らない
834 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 19:27:01.38 ID:k6vnuBvm.net] >>832 c++11のstd::threadならきちんと設定されたコンパイラ、ライブラリなら使えるはず。 gccのバージョンは知らんが、win上で使うなら、mingwだったりcygwinだったりの影響もあるしなんとも言えない。 そもそも使えないってどういう事?
835 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 19:42:39.56 ID:YtvhXGz3.net] >>832 stackoverflow.com/questions/21211980/mingw-error-thread-is-not-a-member-of-std ここいらへんか?
836 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 20:05:21.87 ID:YtvhXGz3.net] >>833 ウインドウもってるだけじゃなくてメモリアローケーションも必須とか言ってるから、 そういうプログラムを作るだけの技量が無い素人が無理して作ったので根本的にダメ。 MFCで作ってたりするかも。爆笑 ところで、以前から気になってたので「"throw new" C++」で検索すると40万件もヒットする。 「throw newは禁じ手」って書かれてるページもあるだろうけど、アホなページが多すぎる。 例外投げる時に例外発生する可能性のある操作なんか、頭沸いてるとしか思えない。(しかもdeleteしないとリークするし) さらに、C#から入ってきたアホはnewするのが当たり前とか、死ね。 476 :デフォルトの名無しさん:2016/02/09(火) 17:42:12.67 ID:GGDlYrLi >>475 システム監視ソフトだからといってメモリ確保しなくていいわけじゃないです そのソフトはどのプロセスがいつ起動してどれだけのメモリを使用していつ終了したかを ログするものでしたがその過程で新たなメモリ確保はどうしても発生します
837 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 20:52:58.77 ID:YKrrGoZL.net] >>829 すまん>>828 のから飛んで脊髄反射でレスしてしまった 無視してくれ
838 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 20:54:44.07 ID:YKrrGoZL.net] あ、IDかわってるけど、>>829 は俺で自己レスね
839 名前:デフォルトの名無しさん [2016/02/14(日) 22:02:02.79 ID:uelnhBqi.net] ウィンドウハンドルに対する操作関連をまとめた、 自作クラスを作成しています。 以下コードの★★の箇所で以下のコンパイルエラーとなります。 ------------------- error C3867: 'AutoOperation::EnumChildProc': 関数呼び出しには引数リストがありません。 メンバーへのポインターを作成するために '&AutoOperation::EnumChildProc' を使用してください ------------------- エラー表記通り「&AutoOperation::EnumChildProc」に変えると、 今度は以下のコンパイルエラーとなります。 ------------------- error C3374: delegate インスタンスを作成する場合以外に、'AutoOperation::EnumChildProc' のアドレスを指定できません ------------------- やりたい事はクラス内でCALLBACK関数の呼び出し処理EnumChildWindowsを完結させたいのです。 解決策をご教授下さい。
840 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 22:27:21.41 ID:r/RAVviG.net] >>834 すみません、自己解決してしまったのですが、そもそもライブラリがないという状況でした MinGWを4.9.2にしたらコンパイルが通りました!
841 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 22:31:54.01 ID:jQtJnDco.net] >>839 AutoOperationはクラストか?クラスなら AutoOperation::EnumChildProcがstaticでないとうまくいかんよ
842 名前:デフォルトの名無しさん [2016/02/14(日) 23:52:18.37 ID:uelnhBqi.net] 「System.Collections.Generic.List<T>型」を「LPARAM型」に変換する方法、 またその逆の変換をする方法、を教えて下さい。 List<T>型をLPARAM型に変換する必要があり、 その後で、List<T>型をLPARAM型から再取得する必要があるのです。
843 名前:デフォルトの名無しさん mailto:sage [2016/02/14(日) 23:59:09.56 ID:KVV6N47s.net] >>842 それC++/CLIじゃね?↓こちらでどうぞ。 くだすれC++/CLI(初心者用)part2 peace.2ch.net/test/read.cgi/tech/1268613679/ スレ立てるまでもない質問はここで 142匹目 peace.2ch.net/test/read.cgi/tech/1454219795/
844 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 00:15:11.02 ID:oAOjOrx0.net] >>836 throw newがそんなに変か? マイクロソフトのMFCとかDeleteする決まりでnew相当のことしてるし、 std::excetionが仮想デストラクター持ってる時点でnewは想定内だと思うが
845 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 01:03:22.65 ID:2arjOQyX.net] template<typename E, typename... A> [[noreturn]] auto my_super_urtra_ excetion(A &&...p) { std::unique_ptr<std::excetion> r; try { auto sp = make_unique<E>( forward<A>(p)... ); r.reset(sp.release()); } catch(...) { termineit(); } throw r; }
846 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 01:18:37.66 ID:t53MVuXe.net] CreateThreadでスレッド作成した場合crtが正しく動く保証はある?
847 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 01:27:44.57 ID:FDnCcdJi.net] イニシャライズ関数とかないんかなー。
848 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 07:11:27.03 ID:X0JRo1x/.net] Win32の話はスレ違いだな
849 名前:デフォルトの名無しさん [2016/02/15(月) 07:58:34.47 ID:CWNdtN9u.net] detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14155900084
850 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 08:29:56.66 ID:E84Q1jzs.net] >>844 >>845 も書いてるけど、スマポにいれるときに必要でしょ。 MFCがそうしてる理由は知らない。もう調べる気にもならない。
851 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 15:58:42.31 ID:OrmzHinO.net] >>846 動かないから代わりに _beginthreadex を使う
852 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 19:21:41.46 ID:/dhi15sf.net] ランタイムに依存せずに,win32api を直接叩くの筋だろうに
853 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 19:28:23.35 ID:+a5jVKa7.net] 独学で勉強中ですごくくだらない質問だと思うんですが、よくわからないのでよろしくお願いします //---------- #include <iostream> int main(){ int *i = new int() ; std::cout << i << std::endl ; return 0 ; } //---------- これだとvalgrindやcppcheckを使ってチェックするとメモリリークしてるとして言われます 実際newしたものをdeleteしてないのでこちらは納得できるんですが、一方次の //---------- #include <iostream> int *i ; int main(){ i = new int() ; std::cout << i << std::endl ; return 0 ; } //---------- これだとnewしたものをdeleteしてないのにどちらのツールもエラーが出ずに終了してしまいます この後者のコードは実際に問題無いんでしょうか? それともただ検出漏れなだけで正しくないものなのでしょうか? また、もし問題がないならその理由(なぜグローバル変数として宣言しているとdeleteしてないのに問題ないのか)も教えていただけると助かります よろしくお願いします
854 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 19:40:37.00 ID:CbTFphiX.net] 問題はある 検出が困難だからじゃね?リンクする全ての翻訳単位を調べる必要がある
855 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 20:25:22.92 ID:nJzI4k3D.net] 昔、plaugerかmeyers様が言っていた「これはリソースリークじゃないんだぜ」ってセリフをドヤ顔で言ってみたくて >>853 みたいなコードを書いてみたが、なんのメリットもないどころか害しかなかったorz
856 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 20:39:29.70 ID:/dhi15sf.net] >>853 どっちもリークしてるよ,後者は検出をとちっているよ
857 名前:デフォルトの名無しさん [2016/02/15(月) 20:42:06.75 ID:515HeFhA.net] cppcheckって int* i = new int; は検出するけど new int; ってやると検出してくれないクソツールだったような
858 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 21:30:54.97 ID:E84Q1jzs.net] リークとは寿命が終わったオブジェクトにメモリ領域が割り当てられている事 グローバル変数の寿命はプログラムの終了に等しいのでリークではない
859 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 21:45:37.09 ID:g9kjW0Ge.net] >>858 int *i ; の iそのものはな。
860 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 21:58:25.68 ID:cINU//5g.net] C++使っていてメモリ以外のネイティブリソースのことが頭にないなんてどれだけアホなんだ
861 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 21:59:58.72 ID:Kxee8Til.net] >>858 それな めんどくさくなりそうだから黙っておいた
862 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 22:47:14.02 ID:nJzI4k3D.net] >>858 僕のドヤッを横取りしないでくれまいか
863 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 23:22:30.66 ID:t1etBRNf.net] >>858 グローバル変数のリークなんて誰も言ってないことでドヤ顔されても… w
864 名前:デフォルトの名無しさん mailto:sage [2016/02/15(月) 23:47:29.60 ID:sBsZfSdn.net] アスペは指摘するポイントがずれているな 「グローバル変数の寿命はプログラムの終了に等しいので(グローバル変数で参照されているオブジェクトの寿命もまたプログラムの終了に等しいので)リークではない」 という日本語だろうに
865 名前:853 mailto:sage [2016/02/16(火) 00:04:03.79 ID:X2hmxT3s.net] 頂いたレスをヒントに色々パターンを試してみて自分なりに納得できました ありがとうございました
866 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 00:12:13.15 ID:yTUaUSx5.net] 何をどう納得したんだか 素人がnewを使うとやはりロクなことがない
867 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 00:47:08.51 ID:utvP1D7N.net] マジ>>860 に尽きる、 >>858 のリークの定義は片手落ちすぐる
868 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 06:42:53.10 ID:8Pefi829.net] そもそもintをnewするな
869 名前:デフォルトの名無しさん [2016/02/16(火) 08:09:37.14 ID:5UqE7wWz.net] おまえらナマポ好きだな
870 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 09:22:32.06 ID:WpzjUCIx.net] >>859 >>863 ヒープ領域とプログラムの終了に関係に対して典型的な勘違いをしている可能性がある (>>853 の一番目の例で「リークしている」と考えている可能性) >>866 >>868 お前らはおそらく他のみんなより周回遅れだからもうレスしないほうがいい
871 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 13:01:17.95 ID:55V2OvFf.net] >>870 お前は周回遅れ以前に方向が明後日だからレスするなよ…
872 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 13:30:13.10 ID:7QfacfPp.net] 熟練者が下位ライブラリで使う以外ではnewは絶対に使わせるな! JavaやC#から流れてきた人間にはC++のnewは到底扱えないものだと いうことが繰り返し繰り返しはっきりしてきた
873 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 13:36:34.99 ID:DcMkse9A.net] そっかぁ 繰り返し繰り返しはっきりしてきたかぁ
874 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 13:39:06.49 ID:xyyoUOSC.net] sbrk と mmap はok?
875 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 13:49:41.64 ID:8Pefi829.net] プログラムの終了でヒープが開放されるのはOSの機能の話であっても、言語仕様ではないよね? 基本的にはプログラム内でnewしてアロケートしたメモリはdeleteしないとダメなんじゃないの? それをメモリリークと呼ぶかどうかは別として
876 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 16:53:19.68 ID:3V9H/1fh.net] 今はツールが検出できるかって話だから、どうした方が行儀が良いとか関係ないんだよ VCのメモリリーク検出ツールなら>>853 の下のバージョンのコードのメモリリークを検出するよ しかし、cppcheckは静的に解析してメモリリークを探すものだから限界があるのだろう
877 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 17:09:29.10 ID:3V9H/1fh.net] あと、メモリリークに対する考え方がツールによって異なるのだろう VCのメモリリーク検出ツールは、newしたものをdeleteし忘れていたら プログラム終了時に教えてくれる単純なものだが これとは違ったポリシーのツールなのかもしれない 例えば、どこからも参照されていないメモリブロックが有ったら、メモリリークとする、という考え方なら グローバル変数に突っ込んである限りは、プログラムが生きている間はずっと参照が残るので deleteしなくてもメモリリーク扱いにならない、とかかもしれない 良くは知らんが
878 名前:デフォルトの名無しさん mailto:sage [2016/02/16(火) 23:59:38.31 ID:RidGc7qJ.net] で?
879 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 00:49:29.84 ID:BPMYjlVf.net] >プログラムの終了でヒープが開放される これやってくれない処理系って例えば何ですかね? 組み込みのOSとかだとあるんかな
880 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 01:03:08.75 ID:N1klTUFY.net] >>853 早い話そのツールはリーク検出については使いものにならないということ
881 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 07:43:11.29 ID:d8kqwnnS.net] プログラム終了までと言うけど一つの翻訳単位で A a; int * p; Aのデストラクタが呼ばれたときはpの寿命尽きてるだろう
882 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 09:50:12.84 ID:STxbdzYG.net] >>881 os(ランタイム)が仕事しないかもよ
883 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 10:12:54.63 ID:UG2kvZqb.net] int * p; pの寿命が尽きたあとでpが指していたヒープ領域が回収されていなければ、その時点でメモリリーク。 そのあと回収されるかどうかは別の話。
884 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 20:09:44.69 ID:o4vOr9JW.net] だけど、LinuxやGNUの人たちの中には プログラム終了時にプロセスで使っていたメモリを開放しない派の人たちがいるでしょ OSが開放するからって理由でさ LinuxはヘボOSじゃないからプロセス終了時に自動でメモリを開放するから余計なことはしないっていうね そういう人たちからしたら int *global = new int; でプロセス終了時にdeleteしてないのをメモリリークで検出されたら困るわけで そういう人たちの圧力に屈して、グローバル変数が参照しているメモリブロックはメモリリーク扱いにしてないんじゃね?
885 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 20:13:44.87 ID:o4UHPyEX.net] もうやめよう もう、やめよう
886 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:13:10.77 ID:sobQnjjW.net] グローバル変数と同じ寿命のオブジェクトを開放しないことはメモリ(およびリソース)リークにあたらない、という人は、 異なる翻訳単位に属する静的オブジェクトが依存関係を有するケースを見たことが無いのであろうか… その場合、起動時の初期化順がA→B→Cなら開放順はC→B→Aでなければコケて例外を吐きかねないが OS(と処理系の静的オブジェクト開放ランタイム)はそんなことお構いなしに適当な順序で開放してくれる なお、異なる翻訳単位に属する静的オブジェクトに依存関係を持たせることは、 プロセス内の実行環境全体に低水準レイヤーのAPIを公開するみたいな階層設計なことがあり一概に糞とは言えない
887 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:13:29.77 ID:BJJMKH5P.net] valgrindのメモリリーク検出が使ものにならないとかwww 使い物にならないのはお前だろwww マジレスするとOSが纏めて解放してくれる環境で自分で一つ一つ解放する方がバカ C99の_ExitかC++11のstd::quick_exitを知らんのか
888 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:15:19.69 ID:sobQnjjW.net] メモリリークの話はもうやめようというレスがあったので 開放順の話にしてみた
889 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:19:53.84 ID:g2jiUPfD.net] delete global;してもOSには返却されないぞ。
890 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:22:14.50 ID:ul+wSSfx.net] メモリーアロケータが握ってるが、メモリアロケータのプロセスが死んだら解放される。 アロケータさんが牛耳ってるところにメモリくれって言いに行ってないって言われたらそのアプリは終了だから。 メモリは解放しましょう。
891 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:35:47.24 ID:e1xOPzhr.net] (スレのレベルを下げるのは)もうやめよう そう言ったんです 不毛ですやん?
892 名前:デフォルトの名無しさん mailto:sage [2016/02/17(水) 21:37:55.44 ID:BJJMKH5P.net] バカに自分のバカさ加減を知らしめないとスレのレベルは下がる一方だろ?