[解決済み] c++0xでnullptrを削除しても大丈夫でしょうか?
質問内容
で
c++03
は、NULLポインタを削除しても何の効果もないことを明確に示しています。実際、以下のように明示的に記述されています。
§5.3.5/2
ということです。
いずれの方法でも、deleteのオペランドの値がヌルポインタの場合、その操作は何の効果もない。
しかし、現在の
ドラフト
に対して
c++0x
という文が抜けているようです。他の草案では、オペランドが
削除式
はヌルポインタ定数ではありません。ヌルポインタの削除はまだ
c++0x
また、そうであれば、どこで?
注意事項
今でも十分な定義があることを示唆する重要な状況証拠がある。
まず
§5.3.5/2
と記述しています。
最初の選択肢(deleteオブジェクト)では、deleteのオペランドの値がNullポインタの値である可能性がある、......。
そして
2つ目の選択肢(配列の削除)では、削除のオペランドの値がヌルポインタの値であるか、または ...
これらは、オペランドがNULLであることを許容することを述べていますが、それ自体では、NULLの場合に何が起こるかを実際に定義しているわけではありません。
次に
delete 0
は、大きな破壊的変更であり、標準化委員会がこの特別な変更を行う可能性は非常に低いでしょう。さらに、この変更がブレークスルーであることは
c++0x
草案 しかし、Annex CはInformativeセクションであり、規格の解釈とは関係ありません。
一方、NULLポインタを削除しても効果がないことを要求していることは、実行時のチェックを追加していることを意味します。多くのコードではオペランドがNULLになることはありえないので、この実行時チェックはゼロオーバーヘッドの原則と相反するものです。おそらく委員会は、標準c++を言語の設計目標に沿ったものにするために、この動作を変更することを決定したのでしょう。
解決方法は?
5.3.5/7に書いてあります。
<ブロッククオートdelete-expressionのオペランドの値がヌルポインタ値でない場合、deallocation関数が呼び出されます(3.7.4.2)。それ以外の場合は、デアロケーション関数が呼び出されるかどうかは不特定です。
と3.7.4.2/3には書いてあります。
もしそうなら、そしてもし再配置関数が標準ライブラリで提供されているものなら、その呼び出しは何の効果も持ちません。
つまり、標準の割り当て解除関数を使うか、ユーザーが提供する割り当て解除関数でヌルポインターを正しく処理する限り、動作はきちんと定義されているのです。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] nullptrとは一体何ですか?
-
[解決済み】JavaScriptで配列の要素を削除する - delete vs splice
-
[解決済み】NULLポインタの削除は安全ですか?
-
[解決済み] C++17でi = i++ + 1;が合法になったのはなぜですか?
-
[解決済み] delete[]が配列であることをどうやって知るのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++