問題タブ [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.
c++ - C++: メモリ リーク
質問: 変数n のどの値で、次のコードはメモリ リークを引き起こしますか?
それがコードです:
- n が 2 の場合、メモリ リークが発生することは明らかです。
- n が 0 の場合
、メモリ リークが発生する可能性があります ( C++ new int[0] によると、メモリを割り当てますか? ) 。
5.3.4/7から
direct-new-declarator の式の値が 0 の場合、要素のない配列を割り当てるために割り当て関数が呼び出されます。
3.7.3.1/2から
サイズ 0 の要求として返されたポインターを逆参照した場合の影響は未定義です。
また
[新規によって] 要求されたスペースのサイズがゼロであっても、要求は失敗する可能性があります。
つまり、それを行うことはできますが、合法的に (すべてのプラットフォームで明確に定義された方法で) 取得したメモリを逆参照することはできません。配列の削除にのみ渡すことができ、削除する必要があります。
以下は、3.7.3.1/2 の文に付けられた興味深い脚注です (つまり、標準の規範的な部分ではありませんが、説明目的で含まれています)。
[32。その意図は、malloc() または calloc() を呼び出すことによってオペレーター new() を実装できるようにすることなので、ルールは実質的に同じです。C++ は、null 以外のポインターを返すためにゼロ要求を必要とする点で C とは異なります。]
- n が 1 の場合、次のようになります。
int *a = Bar(1) および Bar(1) は例外をスローします。変数 a のコンストラクタで例外になるのでしょうか? そして、それはメモリリークを引き起こしますか?
c# - .NET 配置 新規
.NET (C++ など) に新しい配置はありますか?
つまり、VB.NET でメモリを割り当てた場合
BarClass を Foo メモリにインスタンス化したい (次のような...)
ただし、これを行うための構文はありません。
代わりに、次のようなことをしなければなりません:
c++ - 配置に問題がある-new!
参照カウントポインタ<Type>
クラスのインスタンスを配列クラスに配置する際に問題が発生しました。デバッガーを使用すると、コンストラクターが呼び出されることはないようです(これにより、参照カウントが台無しになり、セグメンテーション違反が発生します)。
私のpush_back関数は次のとおりです。
newが呼び出される前の参照カウントはafterと同じです。これが問題であると確信していますが、コンストラクターが呼び出されない理由がわかりません。さらに、Pointer :: Pointer(...)は、Pointer <T>
&またはconst Pointer&のどちらを使用するかをコンパイルします<T>
(え?)、それでも問題があります!
たぶん、私が考慮していない新しい配置に関するいくつかの詳細があります。誰かが何か考えを持っているなら、彼らは大いに感謝されるでしょう!
編集:[要求に応じて、ポインターからの関連する抜粋]
ポインター<T>
&と、、およびT*
演算子->と演算子の演算子=も実装しましたT*
c++ - メモリ割り当てのクラッシュ
理解できない奇妙な問題に出くわしました。私は C/C++ の専門家ではないので、ご容赦ください。Sprite クラスから派生した Player クラスから派生した NPC クラスがあります。スプライト クラスには setupAnimation 関数が含まれており、テクスチャ上の座標を含む float の配列を割り当てます。配列の各要素はアニメーションのフレームを参照します。これはすべて良好で、正常に動作します。
ただし、ポインターの配列を NPC クラスに追加すると問題が発生します。これらのポインターは Item クラス型です。この配列を追加すると、配列が小さい場合 (テストしたサイズは 10 でした) は問題なく動作しますが、サイズが少し大きい場合 (100 は私がテストしたサイズでした)、前述のテクスチャ座標に float の配列を割り当てるとクラッシュします。テスト済み)。
上記の資料を示すコードの一部を次に示します。
ポインターの Item クラス配列:
テクスチャ座標とそれに対応する割り当て:
このコードの断片は、Sprite クラスから派生するすべてのクラスの基礎です。私が理解できないのは、余分な 90 個のポインターが float の割り当て中に問題を引き起こす理由です。これに付随するちょっとしたソフトウェア情報
OS: Windows Vista 32 ビット、コンパイラ: Visual C++ 9.0、プログラム ランタイム メモリ: ~17,600k、システム メモリ: ~2GB
これを念頭に置いて、メモリが枯渇していることはわかりません。また、ポインターの配列が割り当ての失敗の原因となる方法を関連付けることもできません。前述のように、割り当ては Sprite から派生した他のすべてのクラス (および Sprite 自体) で正常に機能しますが、このポインターの配列が NPC クラスに追加されると、NPC はクラッシュせずにこのテクスチャ データ float 配列を割り当てなくなります。
c# - 「new」キーワードはC#でどのような効果がありますか?また、採用されていない場合にのみ警告になるのはなぜですか?
次のコードを検討してください。
これにより、次の警告が生成されます。
「Test2.Data」は、継承されたメンバー「Test1.Data」を非表示にします。非表示が意図されている場合は、new キーワードを使用します。
なぜこれは単なる警告であり、「new」キーワードを追加するとどのような影響がありますか?
私のテストによると、「new」キーワードが追加されると、違いは見つかりません。
誤解しないでいただきたいのですが、私はすべて明示的であることに賛成ですが、「新規」を追加することのメリットについて知りたいと思っていました。
それが何であるかについての私の唯一の考えは次のとおりです。
- 人間の可読性の向上
- 避けられないことを長い道のりで理解するためにコンパイラが残されていない場合、実行時にいくらかの節約
c++ - 「new」キーワードをどのように置き換えますか?
私がずっと前に見つけた記事 (ATM が見つかりません) があり、C++ の new キーワードが悪い理由を述べています。すべての理由を思い出すことはできませんが、最も覚えている 2 つは、new と delete、new[] と delete[] を一致させる必要があることと、malloc のように new と #define を使用できないことです。
私は言語を設計しているので、C++ 言語をどのように変更して、新しい言語をより親しみやすくするかを尋ねたいと思います。新しい記事や記事の問題を気軽に述べてください。記事のリンクが見つかればいいのですが、それは長くて、有名な学校 (IIRC) の教授によって書かれたことを覚えています。
c++ - std::bad_alloc をキャッチするポリシー
そのため、私は自分の開発で Qt をよく使用し、気に入っています。Qt オブジェクトの通常の設計パターンは、 を使用してそれらを割り当てることnew
です。
std::bad_alloc
ほとんどすべての例 (特に Qt デザイナーによって生成されたコード) は、例外のチェックをまったく行いません。割り当てられるオブジェクト (通常はウィジェットなど) は小さいため、これが問題になることはほとんどありません。結局のところ、20 バイト程度の割り当てに失敗した場合、問題を解決するためにできることはほとんどありません。
現在、「大きな」(サイズが 1 ページまたは 2 ページを超えるもの) 割り当てを try/catch でラップするポリシーを採用しています。それが失敗した場合は、ユーザーにメッセージを表示します。ほとんどの場合、それよりも小さいメッセージを表示します。アプリをクラッシュさせてstd::bad_alloc
例外を発生させます。
では、これについてどのような学派が考えているのだろうか?
new
すべての操作をチェックするのは良い方針ですか? それとも、失敗する可能性があると私が予想するものだけですか?
また、リソースがはるかに制限される可能性がある組み込み環境を扱う場合は、明らかにまったく別の話です。私はデスクトップ アプリケーションのコンテキストで質問していますが、他のシナリオに関する回答にも興味があります。
c++ - クラス固有のset_new_handlerを使用する
クラス固有のnew_handler実装については、「効果的なc++」という本で次の例に出くわしました。これはマルチスレッド環境では問題に見えます。私の質問は、マルチスレッド環境でクラス固有のnew_handlerを実現する方法です。
c++ - クラス固有のバージョンのプレースメント new で何をすべきか?
グローバルな配置を置き換えることはできませんが、新しい配置のクラス固有のバージョンを提供できます。クラスが独自の配置 new 演算子を提供する必要があるシナリオには、どのようなものがありますか?
私のクラスがplacement newを実装していなくても、次のコードは機能します(abcの演算子newがオーバーロードされていないと仮定します)。
だから私は解釈します、いくつかのデフォルトの配置 new がありますが、クラスには独自のバージョンの演算子 new を提供できます。私の質問は、そのユースケースは何ですか? 渡された同じポインタを返す以外に何をすべきですか? 遭遇した有用な例/シナリオはありますか?
c# - 新しい SaveFileDialog の作成
多くの考えと検討、そして Google を使った結果、私は自分の SaveFileDialog を作成することに必死になりました。
しかし、どこから始めればいいのかわからず、ウェブ上で何も見たことがないので、誰かがこれを以前に行ったことがあるかどうか、何を調べる必要があるか、またはどうすればこれを行うことができるかを知りたいです。
より多くの機能を追加する必要がある (または追加したい) と感じているため、新しい SaveFileDialog を作成したいと考えています。また、新しいものを構築すれば、C# と、SaveFileDialog が舞台裏でどのように機能するかについて、さらに多くを学ぶことができると感じています。
正直なところ、私は現在の SaveFileDialog が好きではありません (はい、それで機能します) が、機能を追加したいと思っています。
あ、制限はないと思います。私はこれに不慣れで、何が必要なのかわからないため、はっきりとは言えません...