問題タブ [new-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
18022 参照

c# - 関数の「静的な新しい」修飾子のポイントは何ですか?

今日、レガシー コードで何かを見つけました。1つの機能に「静的新規」があります。このように見えます。

クラスBarのDoメソッドのstatic new修飾子がわかりません。C# では、静的メソッドは、オブジェクト名ではなくクラス名でのみ呼び出すことができます。ですから、「新しい」があるのとないのとでは、違いはないと思います。

一般に、構文が不要な場合、C# は単にエラーとして扱います。C# でこのような構文が許可されている理由について、誰もが何か考えを持っていますか?

0 投票する
16 に答える
132718 参照

c++ - delete[] はそれが配列であることをどのように認識しますか?

よし、次のコードで何が起こるかは未定義であることに誰もが同意すると思う。

ポインターはあらゆる種類のものである可能性があるため、無条件で実行するdelete[]ことは未定義です。ただし、実際に配列ポインターを渡していると仮定しましょう。

私の質問は、ポインタが配列であるこの場合、これを知っているのは誰ですか? つまり、言語/コンパイラの観点からarrは、配列ポインターか単一の int へのポインターかどうかはわかりません。arr一体、動的に作成されたかどうかさえわかりません。それでも、代わりに次のことを行うと、

OS は、int を 1 つだけ削除し、その時点以降のメモリの残りを削除することによって、ある種の「大量殺戮」を行わないほど十分にスマートです (これを終了しstrlenていない\0文字列と比較してください。ヒット 0)。

では、これらのことを覚えるのは誰の仕事でしょうか? OS は何らかの種類の記録をバックグラウンドで保持していますか? (つまり、何が起こるかは未定だと言ってこの投稿を始めたことに気づきましたが、実際には、「殺戮」シナリオは起こらないので、実際の世界では誰かが覚えています。)

0 投票する
6 に答える
10663 参照

c++ - newの後には常にdeleteが続く必要がありますか?

deleteメモリリークを防ぐために動的に割り当てられたポインタを再割り当てする場合の必要性は、私たち全員が理解していると思います。しかし、私は興味があります。C++はどの程度の使用を義務付けていますdeleteか?たとえば、次のプログラムを考えてみましょう

すべての意図と目的のために、ここではリークは発生しませんが(プログラムが終了し、OSが戻るとすべてのメモリをクリーンアップするため)、標準でdelete[]はこの場合の使用が必要ですか、または推奨されますか?delete[]そうでない場合、あなたがここにいる理由は他にありますか?

0 投票する
2 に答える
3193 参照

c++ - C++ 'new' 演算子の問題?

私は最近、この暴言に出くわしました。

この記事で言及されているいくつかの点がよくわかりません。

  • delete著者はvsの小さな煩わしさについて言及していますがdelete[]、ソリューションを提供することなく、(コンパイラにとって) 実際には必要であると主張しているようです。私は何か見落としてますか?
  • function の「特殊なアロケーター」セクションでf()は、割り当てを次のように置き換えることで問題を解決できるようです:(アライメントを省略)

    /li>
  • 「::operator new[] のオーバーロードの危険性」では、作成者はnew(p) obj[10]. 代わりにこれではないのはなぜですか(はるかにあいまいではありません):

    /li>
  • 「C++ でのメモリ割り当てのデバッグ」。ここで議論することはできません。

記事全体は、カスタム メモリ管理スキームに配置された重要な コンストラクタデストラクタを持つクラスを中心に展開しているようです。それは役に立つかもしれませんし、私はそれについて議論することはできませんが、共通点はかなり限られています.

基本的に、新しい配置とクラスごとのアロケータがあります。これらのアプローチで解決できない問題は何ですか?

また、私が頭が固くて頭がおかしくなった場合に備えて、あなたの理想的な C++ では、何を置き換えoperator newますか? 必要に応じて構文を発明してください - これらの問題をよりよく理解するために、理想的なものは何ですか。

0 投票する
2 に答える
238 参照

add - Vista ユーザー アカウントの作成

UAC が有効になっている Windows Vista で、ログオン アカウントをプログラムで作成したいと考えています。

ユーザー アカウントを作成する OCX があり、NT と XP で何年も機能していましたが、Vista でアカウントを作成すると、アプリケーションが Access Denied で失敗します。お客様が UAC をオフにした場合、そのアプリをセットアップすると正常に動作します。ただし、ユーザーがアプリの構成を完了する前に UAC をオフにして再起動することは認められません。

0 投票する
2 に答える
4731 参照

c++ - C/C++ 置換/再定義規則?

私は特に C/C++ の初心者ではありませんが、今日、予期していなかったことがいくつかわかりました。これは gcc でコンパイルされます。

これはしません:

これはどちらもしません:

同様に g++ では、これはコンパイルされます:

これはしません:

これは次のことを行います。

(標準の new 演算子を置き換えることは、上記のすべてのケースで機能します。置換 new 演算子を置き換えることは違法です。私は知っています。)

パターンを見るのは簡単ですが、誰かが「標準的な」説明をしてくれませんか? .h ファイルではできないことを .c または .cc ファイルで実行できるのはなぜですか (古い typedef を再定義し、置換が違法な関数を置換します)。


返信いただきありがとうございます。ヘッダー ガードを含む一部のコードを省略しました。最後の .cc の例では、 << を & gt として HTML エンコードしました。> cstdlib を含めるのを忘れていました。コンパイルできるようにコードを修正しました。ただし、もう 1 つ省略していたのは #define _NEW で、これは非常に重要であることがわかりました。どうやら GNU では <new> のヘッダー ガードで _NEW が定義されているため、ここでそれを定義すると、標準の新しいヘッダーを含めることができなくなり、置換が機能しました。

ええ、説明されていない唯一のことは、.c/.cc ファイルで複数回 typedef を再定義できるのに、.h ではできないということです。

とにかくそうしたいというわけではありませんが、ただ疑問に思っています。

編集:ありがとう、それは本当にすべてに答えます。それを xyz に変更すると、特定のスコープで複数の定義が許可されなくなります。これは正しいと感じます。:) 私がこれらの小さなテストを行った理由は、小さなオペレーティング システム用に C および C++ のサブセットを作成しているからですが、既存のライブラリを使用して何も削除せずにテストを支援しているため、試していました。 (1) 自分のコードがテストで呼び出されていること (例: 新しいプレースメント) と (2) 自分のコードが GNU ライブラリと衝突しないことを確認する方法を見つけます。(1) に対する答えは、かなり明白に思えます。標準 Xh から Xh にヘッダー ガード マクロを #define するだけです :)。

0 投票する
2 に答える
463 参照

visual-c++ - Visual Studio 2005 C++ ランタイムの新しい例外

デバッグ ビルドとリリース ビルドの両方を含む VS 2005 C++ プロジェクトがあります。私は次の4つのことを試みました:

  1. Visual Studio でデバッグ実行可能ファイルをビルドし、Visual Studio で実行します。
  2. (1) に組み込まれた実行可能ファイルを、コマンド ライン (Cygwin) を介して外部から実行cdvstudio/debugます。
  3. Visual Studio で Release 実行可能ファイルをビルドし、Visual Studio で実行します。
  4. (3) に組み込まれた実行可能ファイルを、コマンド ライン (Cygwin) を介して外部から実行cdvstudio/releaseます。

最初の 3 つはすべて成功します。プログラムは最後まで実行されます。

ただし、4 つ目は実行時にクラッシュします。デバッグは、原因がmalloc()内部の operatorへの呼び出しであることを示していnew()ます。関連するコンテキストは次のようになります。

私が説明した 4 つのうち 3 つの症状につながる問題を誰かが思いつくことができれば、非常にありがたいです。

0 投票する
9 に答える
988 参照

c# - 「新しい」または「新しい」ではない

newキーワードを使用する場合と使用しない場合のオブジェクト宣言の経験則はありますか?

また