◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

C++に詳しい人来て


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/news4vip/1593170196/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:16:36.107ID:HXqgHo3Va
デストラクタが呼ばれるタイミングが複雑だから
そこら辺の事が載ってるサイトを教えて欲しい

class TEST{
public:
TEST(){}
~TEST(){
std::cout << "oppai\n";
}
};

TEST unchi(){
TEST chinko;
return chinko;
}

int main(){
TEST t=unchi();
std::cout << "manko\n";
return 0;
}

このプログラムで、unchi関数が終わった時点でスタックからchinkoが消されるから、
chinkoのデストラクタが呼ばれると思ったんだけど、どうもそうならないみたいで何故か分からん

つまり俺の予想だと
oppai→manko→oppai
の順で表示されると思ったんだけど実際は
manko→oppai
になってる……

2以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:20:32.355ID:e22ks/2j0
何で開発してる?スタックトレース使えない?

3以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:20:54.986ID:uYeguNpNr
文字列やコンストラクタ名で
教えるのが嫌なになった
教えない

4以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:21:07.657ID:HXqgHo3Va
>>2
gccでやってる
高度な機能は分かりません

5以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:22:01.342ID:HXqgHo3Va
>>3
ちんちん…

6以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:22:03.777ID:e22ks/2j0
実体を返してるからデストラクタは呼ばれないんじゃなかろうか

7以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:24:20.508ID:HXqgHo3Va
>>6
うーん…returnで返したインスタンスに限ってはデストラクタが呼ばれないみたいな仕様なんだろうか
これはgccに独特なのかそれともc++の規格なのか……

8以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:30:47.240ID:e22ks/2j0
忘れちゃった

9以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:32:17.564ID:HXqgHo3Va
しょんなぁ…(´・ω・`)

10以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:33:14.488ID:e22ks/2j0
逆にoppai→manko→oppaiだと思った理由は何なの

11以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:34:53.721ID:HXqgHo3Va
>>10
chinkoはunchi関数のローカル変数だから、unchi関数のネストを抜けた時点で消えるでそ?
だからデストラクタが呼ばれるんじゃないかと

12以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:36:03.907ID:e22ks/2j0
なるほどなるほど、ローカル変数かー確かに〜でもmainで実体コピーされるよね?

13以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:37:03.274ID:HXqgHo3Va
もしかして最適化かな…?
最適化のせいでunchi関数がmainの中に組み込まれてるんじゃないか…?(´・ω・`)
でもそれでデストラクタが呼ばれないってことがあるのだろうか…

14以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:37:27.200ID:e22ks/2j0
それはないと思うぞ

15以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:38:01.743ID:HXqgHo3Va
>>12
コピーされるけど、tとunchiは別物じゃない?
最適化を無視したらメモリアドレスも違うだろうし…

16以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:38:11.672ID:HXqgHo3Va
>>14
ないか(´・ω・`)

17以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:38:21.533ID:e22ks/2j0
考えすぎだと思う

18以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:39:26.012ID:HXqgHo3Va
うーむ…まぁ動けばいいんだけどさ
原因を分からないままにするのって気持ち悪いよね…

19以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:41:36.266
本題とは関係ないけど、TEST t {unchi()}; って書いて

20以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:43:16.778ID:HXqgHo3Va
>>19
そんな書き方ができるの…!?(´・ω・`)
>>1のように書くのと何が違うのん?

21以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:43:25.339ID:aRMCYfJL0
結果見る限りインライン展開されてそう
最適化切ってコンパイルしてみたら

22以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:44:21.224ID:e22ks/2j0
最適化のせいだったらうそついたごめん そうかもしれない あーでも忘れた

23以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:44:21.933ID:HXqgHo3Va
>>21
その可能性あるよね(´・ω・`)
いま夕飯中だから食べたらやってみるわ

24以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:44:34.870ID:HXqgHo3Va
>>22
うむ

25以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:46:54.634ID:ZaC6BX2G0
chinkoどこで表示されるんだ?と思って実行してみたけどやっぱりchinkoは表示されない
コピペミス?

26以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:48:19.191ID:HXqgHo3Va
>>25
chinkoは表示されないぞ
oppaiかmankoが表示される

27以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:49:54.025ID:ZaC6BX2G0
デストラクタ以前に
std::cout << "chinko\n";
がどこにもないのにどうやって表示されるんだ

28以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:50:04.128
古いコンパイラは一度unchi()を呼び出して、返値を一時変数によっこして
戻ってきてそれからtへ代入していた
この一手間があほくさいってんで直接元のところ(t)に代入するように直せよという議論があって実装された歴史の経緯がある

俺の妄想だが

29以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:51:21.450ID:ZaC6BX2G0
って、>>1を読み間違えてた
oppai→manko→oppaiが表示されると思ったのか

30以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:58:28.737ID:HXqgHo3Va
>>28
妄想かい(´・ω・`)
>>29
うむ

31以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 20:58:41.318ID:l1ITT1Mz0
仕様書見ろ

32以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:10:35.419ID:KgLQGDDU0
>>1
最適化がかかって、TEST t=unchi(); が、
chinkoのコピーをtに代入するのではなく、直接tを初期化するようになってるな

33以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:11:16.397ID:HXqgHo3Va
最適化オフにしてコンパイルしてみたけど結果は変わらず…
やはり仕様なのか…?(´・ω・`)

34以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:16:43.035ID:KgLQGDDU0
起こっているのはNRVOと呼ばれる言語仕様レベルで許可された最適化なので、
もしかしたらコンパイラオプションとは無関係に発生するのかもしれない

35以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:18:53.518ID:KgLQGDDU0
やっぱそうっぽい
-fno-elide-constructors オプションをつけるとNRVOを無効化できるらしい

36以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:25:27.990ID:KgLQGDDU0
ちなみにNRVO、「許可された」であって「必ず省略されるとは限らない」ってことに注意な
似たような機能に変数を使わず return TEST(); とするRVOってのがあるが、
こっちはC++17で「必ず省略する」という仕様になった

37以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:25:35.326ID:HXqgHo3Va
マジかい(´・ω・`)
助かるわ、やってみる

38以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:31:12.170ID:HXqgHo3Va
おお!!表示がoppai→oppai→manko→oppaiになったぞ!!

39以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:32:02.688ID:HXqgHo3Va
想定よりoppaiがひとつ多いのは、リターン時に使った領域とtの領域とchinkoの領域がそれぞれ異なるからだろうな

40以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:32:50.099ID:HXqgHo3Va
というか>>35さんかなり詳しいね…
一体何者なのか気になる(´・ω・`)

41以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:37:35.623ID:KgLQGDDU0
>>40
なんか戻り値コピーの省略まわりでいろいろあったなー、とだけ記憶してたのでggったら出てきた

42以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:42:55.722ID:HXqgHo3Va
まぁこの件はこれで解決なんだけど(´・ω・`)
俺はC言語は流暢に使えるんだがC++はぎこちなくてな

typedef struct{
int length;
Element* arr;
} Elements;

こんな感じの構造体をC++で書くと

class Elements{
public:
int length;
Element* arr;
Elements():length(0),arr(NULL){}
~Elements(){ if(arr)delete[] arr; }
};

とまぁこんな感じになる(´・ω・`)
ある関数でElements型の変数を返したいときに、
C言語だとarrはちゃんとコピーされるわけだが
C++(下の書き方)だとreturnした直後にデストラクタで
arrがdeleteされてしまうという問題がある…

どう解決したらいいだろう?

43以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:43:37.889ID:HXqgHo3Va
>>41
なるほど…情報系の研究者か何かなの?(´・ω・`)

44以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:46:55.231ID:KgLQGDDU0
>>42
そんなあなたに『ムーヴコンストラクタ』

class Elements{
public:
 int length;
 Element* arr;
 Elements():length(0),arr(nullptr){}
 Elements( Elements&& elm ) : length(elm.length), arr(elm.arr) { elm.arr = nullptr; }
 ~Elements(){ if(arr)delete[] arr; }
};

これで関数return時や Elements new_e = std::move(old_e); みたいにした時に、
関数内で破棄されるオブジェクトやold_eのarrがnullptrになる
つまりデストラクタで破棄されなくなる

45以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:50:50.950ID:KgLQGDDU0
>>44に補足しておくと、このままだと通常のコピーもできるままなので、
こういうケースでは Elements( const Elements& elm ) = delete; のようにして通常コピーを禁止しておくのが普通
さらに後からの代入も禁止しないといけないので、operator=( const Elements& elm )も = delete 指定しないといけないな
このへん、Element* arr; の代わりに std::unique_ptr<Element[]> arr; を使うだけでOKだったりするけど

>>43
趣味でプログラマーをやっている者だ
仕事でも副業でもやってるけど

46以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:51:00.365ID:HXqgHo3Va
>>44
にゃるほど!!!!!!(´・ω・`)
コピーコンストラクタで元のインスタンスのarrをnullにしてしまえばいいのか!!!!!!
画期的な解決策を本当にありがとう

47以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:52:49.193ID:HXqgHo3Va
>>45
すごく詳しいね(´・ω・`)
助かったよありがとう

48以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:54:01.217ID:KgLQGDDU0
>>46
これはコピーコンストラクタではない、似てるけど&&だからムーヴコンストラクタだ
>>45でdeleteしてるのがコピーコンストラクタね

C++11が出るまではムーヴコンストラクタがなかったからコピーコンストラクタで同じことをやってたけど、
「コピーなのにコピー元を変更してるっておかしくね?」という指摘を受けて、別機能として分離されたんだ

49以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 21:55:31.268ID:HXqgHo3Va
>>48
そんな新しい機能が……(´・ω・`)
個人的にはコピーコンストラクタで元のインスタンスを変更しちゃっても良いような気がするんだけどw

50以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 22:00:59.464ID:KgLQGDDU0
>>49
A a1;
A a2 = a1;
ってコードがあった時に、a1が破壊済みかどうかがAの実装に依存するってかなりのクソじゃん?
ムーヴの場合、
A a1;
A a2 = std::move(a1);
って書き方をすることになるから、a1はもう使うつもりがないとわかる

51以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 22:04:00.971ID:HXqgHo3Va
>>50
なるほど…(´・ω・`)
普通のコピーじゃなく破壊を伴うコピーなんだよーとアピールする感じか

52以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 22:34:01.078ID:KgLQGDDU0
>>51
そういうことですな
特にC++の場合、template機能により実際にどの型を使ってるのかわからなくなることがあるので、
いつの間にか破壊されてると大変なことになるのだ

53以下、5ちゃんねるからVIPがお送りします2020/06/26(金) 22:44:13.697ID:HXqgHo3Va
>>52
よく分かりますた(´・ω・`)
thx!


lud20200808102107
このスレへの固定リンク: http://5chb.net/r/news4vip/1593170196/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「C++に詳しい人来て 」を見た人も見ています:
鬱に詳しい人来て
猫に詳しい人来て
猫に詳しい人来て
PCに詳しい人来て
お酒に詳しい人来て
税金に詳しい人来て
測量に詳しい人来て
女心に詳しい人来て
法律に詳しい人来て
水道管に詳しい人来て
GPUに詳しい人来て
法律に詳しい人来て
仏教に詳しい人来て
タバコに詳しい人来て
化学式に詳しい人来て
ギターに詳しい人来て
加藤純一に詳しい人来て
絵の練習に詳しい人来て
Androidに詳しい人来て
プーさんに詳しい人来て
耳の病気に詳しい人来て
ゲーセンに詳しい人来て
ガスガンに詳しい人来て
ノートPCに詳しい人来て
鳥の鳴き声に詳しい人来て
Windows10に詳しい人来て
水の生き物に詳しい人来て
法律 判例に詳しい人来て
技能実習生に詳しい人来て
ダイエットに詳しい人来て
ガンダム00に詳しい人来て
格安スマホに詳しい人来て
アニメ漫画映画に詳しい人来て
コード理論に詳しい人来て
離婚関係養育費に詳しい人来て
建築士とか建築に詳しい人来て
【画像】CADと製図に詳しい人来て
プログラミングに詳しい人来て
小説家になろうってサイトに詳しい人来て
ロードオブザリングに詳しい人来て
経済に詳しい人来て!!FRBの利上げについて
モードとかストリートファッションに詳しい人来て
車に詳しい人来てくれい
釣りに詳しい人来てくれ
PCに詳しい人来てくれ
筋トレに詳しい人来てくれ
清潔感に詳しい人来てくれ
遊戯王に詳しい人来てくれ
Androidに詳しい人来てくれ
生命保険に詳しい人来てくれ
PCに詳しい人来てくれ!!!
AVに詳しい人来てください
新世界よりに詳しい人来てくれ
車のオイル交換に詳しい人来てくれ
5chのやばい板に詳しい人来てくれ
Wikipediaに詳しい人来てくれ
女だけどPS4に詳しい人来て!
見える子ちゃんに詳しい人来てくれ
VIPのエロSSに詳しい人来てくれ
認知症(痴呆?)に詳しい人来てくれ
関西○交に詳しい人来てください
アニメに詳しい人来てください
【急募】植物に詳しい人来てくれ
ルイヴィトンに詳しい人来てくれ
株とか投資信託に詳しい人来てくれ
ネットに詳しい人来てください
09:32:38 up 12 days, 19:56, 0 users, load average: 12.98, 16.20, 26.24

in 0.14211201667786 sec @0.14211201667786@0b7 on 122423