- 1 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 09:05:42.21 ID:mJKRg6iz0.net]
- 次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part133 mevius.5ch.net/test/read.cgi/tech/1511509970/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1509780815/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
- 82 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 07:54:17.35 ID:CtmFRYuD0.net]
- >>79
>>62
- 83 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 08:05:48.85 ID:cp/uvOeq0.net]
- >>62
処理系に依存することなく「
- 84 名前:保証」なんて出来ない
以上 [] - [ここ壊れてます]
- 85 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 08:27:38.08 ID:rGp9SuaC0.net]
- >>63で解決している
もしくは以下への回答も>>69で出ている
- 86 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 09:14:20.61 ID:CtmFRYuD0.net]
- バイト列コピーが = default; なわけねーだろアホ
- 87 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:45:28.85 ID:rGp9SuaC0.net]
- よく読め
バイト列コピーでokの保証は>>69 遅くならないコンストラクタの書き方が>>63
- 88 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:48:04.39 ID:rGp9SuaC0.net]
- そもそも「どうコンストラクタを書けば」ってのを質問してるんで
バイト列コピーでコンストラクタを書けってのは単に>>65の珍解答に過ぎない
- 89 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:51:41.68 ID:CtmFRYuD0.net]
- すまんが日本語でたのむ
- 90 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 11:54:37.03 ID:rGp9SuaC0.net]
- 元の質問>>62は
・処理系に依存せずデフォルトより遅くならないことが保証されているコンストラクタの書き方 もしくは ・バイト列コピーでokと明示する構文 だろ。 前者は>>63 後者は>>68-69
- 91 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 12:36:57.61 ID:CtmFRYuD0.net]
- 元質問: デフォルトのコピーコンストラクタ以上の性能
おまえ: デフォルトより遅くならないこと よく読めをそのまま返す
- 92 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 12:57:03.34 ID:bHMYZ9Vj0.net]
- 以上っていうのは等しいかまたはそれを越えるという意味だぞ
- 93 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 14:01:35.47 ID:rGp9SuaC0.net]
- そもそも memcpy は前者の性能保証も後者の仕様の保証もどちらも満たしてない
仕様が保証されてるなら多分性能的に大丈夫だろうという程度 間違いを認めると死ぬ病気なんだろうからもうこれ以上は言わない。
- 94 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 14:38:54.29 ID:CtmFRYuD0.net]
- バイトコピーでmemcpyより高性能な手段を1つでも例示したらどうなんだ
> 間違いを認めると死ぬ病気なんだろうから ああ、おまえがか
- 95 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 18:18:02.35 ID:cp/uvOeq0.net]
- https://stackoverflow.com/questions/28623895/why-is-memmove-faster-than-memcpy
- 96 名前:62 mailto:sage [2018/02/06(火) 22:02:19.27 ID:MckGyr3K0.net]
- memcpy()より速いコピー手段Xが仮にあったとして
論理的にmemcpy()で済むケースについてコンパイラが提供する デフォルトのコピーコンストラクタがコピー手段Xにならない理由がわからん… 個人的には「=default;」と書いたら最高性能なんなら毎回手でmemcpy()とか書きたくないカンジ
- 97 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:06:49.77 ID:CtmFRYuD0.net]
- >>94
class A { public: A() {} A(A const&) { std::cout << "aho"; } }; class B { public: A a; B() = default; }; int main() { B b, c = b; //this will call you. }
- 98 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:09:42.68 ID:MckGyr3K0.net]
- >>95は「論理的にmemcpy()で済むケース」では無いからちげう
- 99 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:29:22.47 ID:CtmFRYuD0.net]
- だから日本語でたのむって言っただろ
- 100 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 22:29:24.08 ID:MckGyr3K0.net]
- どうした?
訂正はよ
- 101 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 23:07:57.82 ID:hdfY5rL3M.net]
- 間違いを認めて・・・死んだのか?
- 102 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 23:21:41.18 ID:MckGyr3K0.net]
- 仕方ないので漏れが訂正するわ;
ttps://ideone.com/TZnGv4 ↑のコードの (*1)は「=default;」でデフォルトのコピコンの使用を明示 (*2)は手でmemcpy()でコピーするように書いたコピコン 次の条件で試したら(*1)も(*2)も同じコードになったわ x86-64 gcc 7.2 -O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた ttps://gcc.godbolt.org/ 漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
- 103 名前:デフォルトの名無しさん mailto:sage [2018/02/06(火) 23:34:18.80 ID:Ur4dB7lv0.net]
- Cから来た連中ってどうしてmemcpyやmemset使いたがるんだろうな
- 104 名前:はちみつ餃子 mailto:sage [2018/02/07(水) 04:09:18.59 ID:OAPGz/K+0.net]
- >>76
reinterpret_cast でなければ通らないときはだいたい駄目なときやわ。
- 105 名前:はちみつ餃子 mailto:sage [2018/02/07(水) 04:
]
- [ここ壊れてます]
- 106 名前:22:37.75 ID:OAPGz/K+0.net mailto: >>100
「default がバイト列コピーとは『限らない』」という意味で >>84 は真。 [] - [ここ壊れてます]
- 107 名前:デフォルトの名無しさん mailto:sage釣 [2018/02/07(水) 05:00:09.29 ID:1UF8v8gcM.net]
- 開始アドレス、終了アドレス、サイズが64bit等で割り切れれば
バイトコピーより早いコピーはあるだろうね
- 108 名前:デフォルトの名無しさん [2018/02/07(水) 07:27:28.65 .net]
- 頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?
知らんけど
- 109 名前:デフォルトの名無しさん [2018/02/07(水) 22:28:51.20 ID:MTpdY7NJ0.net]
- "!"!"!MOHYO!"!"!"2"
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]] 2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL! 3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{ 41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0 .3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end {
- 110 名前:片山博文MZ mailto:sage [2018/02/10(土) 19:52:35.19 ID:x9I4Wn6Pd.net]
- C++では、
int i; for (i = 0; i < 9; ++i) { ... } が、 for (int i = 0; i < 9; ++i) { ... } って書けるのは知っているだろう。( )の中で、変数を宣言できる。 だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
- 111 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 04:31:12.99 ID:9irhhPDg0.net]
- C++17では
if ( auto v = n; conditions ) { ... } が可能になるし、これからは広がってくれるかのう
- 112 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 06:11:03.22 ID:l3GMmVaq0.net]
- >>108
これホント待ち遠しい
- 113 名前:デフォルトの名無しさん [2018/02/11(日) 17:00:15.07 ID:RGzNlubj0.net]
- それほど待ち遠しいか?
- 114 名前:デフォルトの名無しさん [2018/02/11(日) 17:27:44.93 ID:QA9xO9uU0.net]
- 待ち遠しくない
- 115 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:34:07.64 ID:A61Ds/EIM.net]
- for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
- 116 名前: mailto:sage [2018/02/11(日) 17:36:34.68 ID:bT0HWvJB0.net]
- 理想主義的な文法ですが、実効性はあるのか疑問ですね
- 117 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:40:12.67 ID:KWDwqk940.net]
- 一瞬意図が分からなかったが
()の中が;で区切れるという話?
- 118 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:41:52.24 ID:rD0gl3AiM.net]
- dynamic_castとの組み合わせで使うとかどうよ
- 119 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 19:11:10.58 ID:av7bQMHG0.net]
- 結構あると思うけどね
if(DWORD err = GetLastError(); err != NO_ERROR) この場合NO_ERRORが0だって分かってるから if(DWORD err = GetLastError()) で済むから無意味だけど
- 120 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 19:17:28.82 ID:yo2OB3cP0.net]
- >>116
前者の方が意図が明確だし意味はあると思う
- 121 名前:デフォルトの名無しさん [2018/02/11(日) 20:06:43.52 .net]
- >>116
>if(DWORD err = GetLastError(); err != NO_ERROR) 普通こうやろ if((DWORD err = GetLastError()) != NO_ERROR) 変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと) 複文書けるのは特にメリット感じないわ
- 122 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 20:41:29.80 ID:Ag9E1Urq0.net]
- それ通らんよ
こうだろ DWORD err;
- 123 名前:
if((err = GetLastError()) != NO_ERROR) if内でしか使わないerrが外部に漏れてるのがよろしくないってこと [] - [ここ壊れてます]
- 124 名前:デフォルトの名無しさん [2018/02/11(日) 20:56:03.30 .net]
- >>119
それが通るという変更だと思ってたわ こう書けるPerlのほうがまだ優位性あるね if((my $err = GetLastError()) != NO_ERROR)
- 125 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 22:10:23.49 ID:p+z832PL0.net]
- if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい if(int err = GetLastError(); hoge.aho()) lock_guardもしておける if(std::lock_guard<std::mutex> lock(m); flag) 構造化束縛も使える if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
- 126 名前:デフォルトの名無しさん [2018/02/12(月) 12:22:30.52 ID:sATukCOa0.net]
- Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
- 127 名前:デフォルトの名無しさん mailto:sage [2018/02/12(月) 12:43:48.54 ID:qekpeHDJ0.net]
- >>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
- 128 名前:デフォルトの名無しさん mailto:sage [2018/02/12(月) 14:08:57.84 ID:sGdsmrZD0.net]
- 初心者スレに池
- 129 名前:デフォルトの名無しさん [2018/02/12(月) 20:44:41.93 ID:gfcybQxo0.net]
- >>122
気のせい。
- 130 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 00:10:36.10 ID:YGwN9DGw0.net]
- >>122
Cにnamespaceは無いだろ
- 131 名前:はちみつ餃子 mailto:sage [2018/02/13(火) 17:30:20.31 ID:tUR5ZBgZ0.net]
- 構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
- 132 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 17:45:08.06 ID:a1RYP/Gm0.net]
- こんな名前空間もあるね
int x; int main(void) { x = 1; int x; x = 2; { int x; x = 3; } return 0; }
- 133 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 17:55:17.58 ID:Xr6xvVy+M.net]
- それはスコープでは
- 134 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 18:15:03.36 ID:a1RYP/Gm0.net]
- 変数だよ
代入でもあるね
- 135 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 20:09:02.02 ID:NNOtJgpO0.net]
- 謎すぎワロタがそこから上のスコープのxを参照してくれ
- 136 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 20:19:22.41 ID:Za/EZbH7M.net]
- ブロックって言ってる
- 137 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 21:49:01.90 ID:a1RYP/Gm0.net]
- アホばっかり
がっかり
- 138 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 12:08:37.28 ID:Sgd3BwBT0.net]
- std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、 キャッシュのような機能を実装したいのだけど、 C++でそのような仕組みを作れるクラスはないですか?
- 139 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 17:00:44.45 ID:GbCJk+7h0.net]
- 自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている
- 140 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 18:15:51.96 ID:6url8MQd0.net]
- バックグラウンドならスレッド使うしかないんじゃないかな
- 141 名前:デフォルトの名無しさん [2018/02/15(木) 19:13:27.39 ID:CSnzpiZpM.net]
- C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
- 142 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 19:34:35.63 ID:95vLe5Bi0.net]
- >>137
どんな点が、性格悪い、と思わせるのですか?
- 143 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 20:03:21.73 ID:qihnyYvs0.net]
- それだよそれ
- 144 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 21:14:35.68 ID:MoAPifjS0.net]
- C++は多分チューリング完全だと思う
- 145 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 21:20:32.50 ID:6nYos/bmM.net]
- >>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
- 146 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 23:50:52.95 ID:fG1U9Z3qM.net]
- >>135
簡単で良いのでサンプルコード書いてもらえませんか?
- 147 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 00:43:14.82 ID:uaG+5sVQ0.net]
- >>135じゃないけどシンプルにいくなら
{ map<key,value> data; // 本来のデータ map<key,list<key>::iterator> lruindex; // list<key> lrulist; // LRUリスト ... // mapと同じインターフェイス } みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
- 148 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 03:16:29.76 ID:DpsRPWWQ0.net]
- 辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、
class LRU_hash def initialize (max_size = 3) # ary は、hash に追加・アクセスした順 @hash = {}; @ary = [] @max_size = max_size end def push (key) if @hash.has_key? key # 一旦、要素を削除してから、最後尾に追加しなおす @ary.delete key else if @max_size == @hash.size # 先頭要素を削除してから、最後尾に追加する @hash.delete(@ary.shift) end @hash[key] = true end @ary.push key end def print_buf puts @ary.join ', ' end end ary = ["あ", "a", "あ", "い", "b", "あ", "c"] hash = LRU_hash.new 4 ary.map { |key| hash.push key } hash.print_buf #=> い, b, あ, c
- 149 名前:デフォルトの名無しさん [2018/02/16(金) 04:31:51.17 .net]
- >>144
> # ary は、hash に追加・アクセスした順 参照のたびに最後尾に追加しなおすの?
- 150 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 06:27:04.53 ID:HICjIKnm0.net]
- プログラムを作っていて困っています。
プログラム動作環境、windows 7 x86_x64 プロセスをExplorerを親として、 起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして 割り当てたい。 ただし、プロセスへのアタッチによる変更は禁止とする。 ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。 例 C:\hoge\fuga.exe [現状] Explorer C:\hoge\fuga.exe 親 explorer.exe カレントディレクトリ C:\Windows\System32\ [理想] Explorer C:\hoge\fuga.exe 親 explorer.exe カレントディレクトリ C:\hoge\
- 151 名前:144 mailto:sage [2018/02/16(金) 07:56:00.35 ID:DpsRPWWQ0.net]
- >>145
>>134 で、LRU と書いてあるから、Hash に追加しようとした度に、 すでに存在する場合でも、配列の最後尾に追加しなおした どういう意味か、正確にはわからないけど
- 152 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 08:03:01.53 ID:TOIQut300.net]
- >>146
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、 COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?
- 153 名前:134 mailto:sage [2018/02/16(金) 09:56:21.20 ID:+b2iJMK40.net]
- みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも 無いかと思ったのですが、標準ではやっぱり無いですか。 >>143のように、std::mapをメンバの一つに持たせた独自クラスを 一から作っていくことになるんですかね。
- 154 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 10:11:55.71 ID:JoalkiMd0.net]
- amazonランキングの謎を解く とか言う本でmove-to-frontを見た
本の紹介「Amazonランキングの謎を解く」 www.kenkyuu.net/whatsnew/2011/08/book2011-08-01.html >「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする) Move To Front - Wikipedia https://ja.wikipedia.org/wiki/Move_To_Front
- 155 名前: []
- [ここ壊れてます]
- 156 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 10:54:10.09 ID:TOIQut300.net]
- ageだね
- 157 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 14:25:37.67 ID:UjPhOEUu0.net]
- >>149
「c++ lru map」でググったか? いくつかサンプルになりそうなコードが見つかるんだけど
- 158 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 18:05:58.99 ID:GGXfeEqkM.net]
- 江添さんのC++17本予約しようかな
- 159 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 18:26:06.12 ID:waI0am5S0.net]
- 予約しなくても売れ残るからいつでも買える
- 160 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:04:35.13 ID:1Lr9lxEpa.net]
- C++を勉強しようと思ってる者ですが書籍を探しております。Cはある程度書けるのでそれを前提とした書籍が欲しいです
- 161 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:33:50.33 ID:Rc+MuzY40.net]
- C++ クイック入門&リファレンス
プログラミング言語C++ 第4版
- 162 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:36:34.10 ID:9b60nRDg0.net]
- >>155
C++11 以前だが accelerated c++, ここでフォローするよ
- 163 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:37:11.23 ID:TOIQut300.net]
- 禿4は俺も推奨する
C++11の良本だ
- 164 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 21:09:12.34 ID:+EaaPhKWa.net]
- めっちゃ高いけどその価値あるのね
- 165 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 21:46:03.21 ID:5AmFsIq1M.net]
- こっちはフッサフサやでhttps://images-na.ssl-images-amazon.com/images/I/51fYzbYoXFL._UX250_.jpg
- 166 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 22:03:34.89 ID:qDhjnryl0.net]
- 誰がハゲやねん
- 167 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 09:43:48.64 ID:Lqib7/b9F.net]
- 以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。 どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。 #include <string.h> #include <string> #include <iostream> int main() { const char* asdf = "asdf"; // char* psz2 = new char[strlen(asdf)+1]; // strcpy(psz2, asdf); std::string *psz = new std::string(asdf); char* psz2 = &(*psz)[0]; std::cout << psz2 << std::endl; delete psz2; return 0; }
- 168 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 09:51:35.08 ID:mykV+fTk0.net]
- delete psz2なんてしちゃだめconst関係ない
- 169 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 10:21:38.22 ID:4SqFrjwY0.net]
- 何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない stringの内部データは静的な配列と動的な配列を組み合わせて表現されている mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない msvcはdeleteに失敗しても落ちないのかな
- 170 名前:デフォルトの名無しさん [2018/02/17(土) 10:47:53.57 ID:IU1gsQgu0.net]
- >>155-159
本格的な本なら、ロベール、ハーバート・シルトの独習 軽めの本なら、柴田 望洋、林 晴比古、猫
- 171 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:22:13.08 ID:++v6vSjK0.net]
- ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。 psz2もnull terminatedの保証がないからc_strを使うべき。 うまくいったらstrdupも調べとこうな。
- 172 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:25:45.81 ID:szUqPRvW0.net]
- >>162
char* psz2 = &(*psz)[0]; って char* psz2 = psz->c_str(); と同じなのかな? いずれにせよ delete psz; は出来る(するべき?)だけど、 delete psz2; は出来ないんじゃないかな。
- 173 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:30:29.43 ID:mykV+fTk0.net]
- 必要ないところでnew/delete使う人は根本からして
- 174 名前:何も分かってない []
- [ここ壊れてます]
- 175 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 15:18:23.73 ID:YAgvIyFy0.net]
- >>162
お前はstringがただの配列だと思っているのか? このトンチキ野郎!
- 176 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 16:50:38.35 ID:Q4Uv6cZz0.net]
- >>162
弁護士の唐沢です しっかり「char* const」と「const char*」の違いを認識しなさい const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね? 最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
- 177 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 17:22:58.60 ID:0j+aLKWi0.net]
- >>162
strdupという手があるが何がしたいのか今一つ分からない const char* asdf = "asdf"; char *p = strdup(asdf); std::cout << p << std::endl; delete p;
- 178 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 17:31:15.32 ID:CLg9GPlRM.net]
- >>170
それ誰に指摘してんの?とりいそぎ。
- 179 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 17:34:22.09 ID:4SqFrjwY0.net]
- >>167
データは連続しているので同じになる 16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる 実装ではメンバの配列には何かしらのエスケープ文字が入る ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
- 180 名前:173 mailto:sage [2018/02/17(土) 17:49:08.26 ID:4SqFrjwY0.net]
- 補足
スタックとヒープを使い分けるかどうかは実装依存 gcc、clang、msvcでは行われている したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
- 181 名前:デフォルトの名無しさん [2018/02/17(土) 18:06:03.81 .net]
- >>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
- 182 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:09:26.31 ID:Lp1rq1Kt0.net]
- 良いみたいだ
中でmallocで確保している
|

|