問題タブ [delete-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 投票する
7 に答える
3078 参照

c++ - C++ 配列削除演算子の構文

私がした後、言う

Foo* array = new Foo[N];

私はいつもこの方法で削除しています

delete[] array;

しかし、時々私はそれをこのように見ました:

delete[N] array;

コンパイルして動作するように見えるので (少なくとも msvc2005 では)、私は疑問に思います: それを行う正しい方法は何ですか? では、なぜ逆にコンパイルされるのでしょうか?

0 投票する
13 に答える
16896 参照

c++ - C ++削除-オブジェクトを削除しますが、データにアクセスできますか?

クラスシングルブロックのインスタンスとして各ブロックを使用して、シンプルで機能するテトリスゲームを作成しました。

完全な行をスキャンし、ブロックのリンクリストを実行して、関連するブロックを削除し、->次のポインターを再割り当てする関数があります。

ゲームは動作し、ブロックは正しく削除され、すべてが想定どおりに機能します。ただし、検査すると、削除されたデータのランダムなビットにアクセスできます。

削除後に削除されたシングルブロックの「x」値をそれぞれprintfすると、ランダムなガベージを返すもの(削除を確認するもの)と222を返すものがあり、デストラクタが呼び出されても、データは実際には削除されていないことがわかります。ヒープ。多くの同一の試行は、適切に削除されないのは常に同じ特定のブロックであることを示しています。

結果:

予想外のデータにアクセスできるのでしょうか?

これが少し長蛇の列になっている場合は申し訳ありません。

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

c++ - totalviewでメモリリークとして表示されるdelete[]のMalloc呼び出し

私はHDF5を使用して、char*によって割り当てられた文字列に文字列を読み込みますnew[]。次に、string ::assign()呼び出しを使用して、このデータを実際に必要な場所にコピーします。delete[]次に、そのchar*を呼び出します。これは、totalviewを使用したメモリリークの原因として表示されています。stdlibc ++で、、、、、およびの間にマングルされた呼び出しが表示delete[]されます。何が起こっているのですか、これは本当にメモリリークですか?私もここに設定しました。replace_safemutatecreatemallocGLIBCXX_FORCE_NEW=1

これは、状況を複製するサンプルコードです。valgrindはリークを示さず、呼び出しの前にブレークポイントを設定しない場合cout、totalviewによってリークは検出されないことに注意してください。

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

c++ - 「delete this;」を使ってもいいですか?Thread クラスから継承するオブジェクトで?

一般に、あるクラスを継承するクラスがあり、そのクラスのインスタンスが実行終了後に自動的に割り当てを解除Threadされるようにしたい場合、delete this

具体例:

私のアプリケーションには、 という1 つのメソッドを持つTimerクラスがあります。ユーザーは次のように呼び出します。staticschedule

このscheduleメソッドはTaskオブジェクトを作成します (目的は Java TimerTask オブジェクトに似ています)。Taskクラスはクラスに対するprivateものであり、Timerクラスから継承しますThread(pthreads で実装されます)。したがって、scheduleメソッドはこれを行います:

コンストラクターはTask、新しいスレッドで使用するために引数を保存します。新しいスレッドでは、タスクのrunメソッドが次のように呼び出されます。

task新しいスレッドが必要とするため、オブジェクトをスタック割り当てオブジェクトにすることはできないことに注意してください。また、他の人が使用できないようにTaskクラスprivateTimerクラスにしました。

Taskオブジェクトを削除するということは、基になるオブジェクトを削除することを意味するため、特に心配していThreadます。Threadオブジェクトの唯一の状態はpthread_t変数です。これが戻ってきて私を噛む方法はありますか?メソッドが終了pthread_tした後は変数を使用しないことに注意してください。run

(メソッドへの引数またはコンストラクター内の何かdelete thisを介して) ある種の状態を導入することにより、呼び出しをバイパスすることができます。これは、メソッドを呼び出しているオブジェクトに対してフォークされるメソッドであることを示します。ただし、コードはそのまま動作するようです。Thread::startThreaddeleterun

何かご意見は?

0 投票する
5 に答える
530 参照

c++ - c++ に new と delete の別の構文があるのはなぜですか?

通常の関数呼び出しだけにできないのはなぜですか? 新しいのは基本的に次のとおりです。

削除中

では、なぜ new/delete は通常の関数ではなく独自の構文を持つことになるのでしょうか?

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

c++ - オーバーロードされたプール演算子の削除をどのように宣言して使用しますか?

C++-FAQ-lite のセクション 11.14を配列に適用する方法を知りたいです。

基本的に、私は次のようなものが欲しいです:

ただし、 this を宣言して呼び出すための正しい構文を理解できませんでしたoperator delete[] (pool)。誰でもここで助けることができますか?

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

c++ - 組み込みのデータ型とユーザー定義のデータ型は、削除によってどのように区別されますか?

私がこれを行う場合:

では、C++ コンパイラはどのようにしてオブジェクト フォローイングdeleteが組み込みデータ型またはクラス オブジェクトであることを認識するのでしょうか?

私のもう1つの質問はnew、の配列へのポインターでintあり、その後、delete []コンパイラーは割り当てを解除するメモリブロックのサイズをどのように知るのでしょうか?

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

c++ - std :: mapの削除(Visual C ++)

削除しようとしているマップへのポインタがあります(このマップにはnewが割り当てられています)。

このマップは有効だと思います。デバッグ中にカーソルを合わせると、次のように表示されpMapます[0]()

この空のマップを削除しようとすると、アプリが終了し、

myapp.exeの0xsomelocationでの初回例外:0xsomenumber:呼び出されたオブジェクトがクライアントから切断されました。

出力ウィンドウで。これは何を意味するのでしょうか?

ありがとう..

編集:ここにいくつかのサンプルコードがあります:

StructBにはオーバーロードされた演算子があります() 編集:StructBは確かに構造体です、申し訳ありませんが、演算子()は単なる文字列比較関数です。

私のコードのある部分では、クラスのコンストラクターがメソッドを呼び出します。それをInitClass()と呼びましょう。これにより、myMapポインターが次のように初期化されます。

後でこのクラスのデストラクタで、私は行きます

ありがとう

編集:動作していた古いバージョンのコードに戻しましたが、現在は正常に動作しています。

うまくいったのは次のようなものでした:

以前、私はそれをこれに変更しました:

奇妙な..コードに何か問題があるかもしれませんが、まだどこにあるのかわかりません..コード全体を投稿すると大きすぎる(そしておそらく解雇されるでしょう)ので、そのままにしておきましょうそれで..

問題の原因となったのは、クリアまたは削除しようとしたnullマップへのポインターであった可能性があります。

助けようとしたすべての人に感謝します...:)

0 投票する
8 に答える
219 参照

c++ - ここで削除を正しく使用していますか?

C++クラスと動的配列の知識を組み合わせ始めたところです。「新しい演算子を使うときはいつでも」削除すべきだというアドバイスを受けました。デストラクタがどのように機能するかも知っているので、このコードは正しいと思います。

main.cpp

PicLib.cpp

PicLibに、Picより動的な配列を含むクラスを入力します。Picのデストラクタは、上記と同じ方法でそれらを削除します。私はそれdelete [] databaseがそれらすべてのクラスを適切に取り除くと思います。

では、 main.cppでの削除は必要ですか?ここでハンキーなドーリーに見えるものはすべてありますか?

0 投票する
3 に答える
249 参照

c++ - メモリエラーを削除

私は次のシナリオを持っています、

この関数は、まだ割り当てられていないときsetTestに削除しようとするため、呼び出されるとエラーをスローします。_testこれは、_testが0X0に設定されていないために発生しています。

誰かが私がこれを理解するのを手伝ってくれる?