■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[] に渡せるなら問題ないってことでしょう。
|
|