C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: これが合法な理由は。。。


(過去ログ 173 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■99748 / inTopicNo.1)  これが合法な理由は。。。
  
□投稿者/ 雲 (4回)-(2022/05/20(Fri) 17:55:35)

分類:[C/C++] 

たまたま OpenSource のコードを読んでいたら、こんなことが書いてありました。


shared_ptr<int[]> v;

v.reset( new int[10] );


これが合法な理由を全く思いつきません。

当然ですが、

int[] x;

は非合法。。。ヒントだけでもご指摘頂けると幸いです。というか降参です。


引用返信 編集キー/
■99749 / inTopicNo.2)  Re[1]: これが合法な理由は。。。
□投稿者/ 雲 (5回)-(2022/05/20(Fri) 18:06:01)
> shared_ptr<int[]> v;
>
> v.reset( new int[10] );
>
>
> これが合法な理由を全く思いつきません。


https://udon.little-pear.net/c-shared-ptr-array/

↑これですかね?C++17にこんな機能があるとは知りませんでした。
引用返信 編集キー/
■99752 / inTopicNo.3)  Re[2]: これが合法な理由は。。。
□投稿者/ 774RR (880回)-(2022/05/24(Tue) 10:52:52)
まあ既に自分で答えを出しているわけですが

その昔、初期の boost はコンパイラ側のバグなり望まない仕様なりを回避する目的で
shared_ptr<T> と shared_array<T> を別途用意して使い分けることにしたわけです。

new T -> delete T は合法だけど new T -> delete T[] や new T[] -> delete T は非合法で(当時のコンパイラでも非合法)
この前者と後者をソースコードだけで自動判断するには、昔のコンパイラでは力不足だった
→しかたないので shared_ptr と shared_array に分離して、人間の判断で使い分ける仕様とした

(手元にとってあった boost_1_43_0 ではまさにこれ)

今のコンパイラは十分強力になってバグも減ったということで boost を std に統合する際にこの仕様をやめて
shared_array を shared_ptr に統合したという経緯があるようです (C++17 で採用?)
(この辺、組み込み系の C++ コンパイラがまともに C++11 にすら対応していないので詳細を追っかけていないっス)
https://faithandbrave.hateblo.jp/entry/2017/01/27/140704

shared_ptr の中で new T[N] の結果を正しく delete[] に渡せるなら問題ないってことでしょう。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -