問題タブ [stdmap]
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++ - std::map の要素をイテレータで削除するにはどうすればよいですか?
std::map
内容に基づいてアイテムをループして削除したいと思います。これはどのように行うのが最善でしょうか?
c++ - ポリモーフィック型のエラーとクリーンアップの質問はなぜですか?
エラーは「'dynamic_cast' : 'base' はポリモーフィック型ではありません」です。これを修正するにはどうすればよいですか? way1 と way2 の両方ですべてが適切にクリーンアップされていますか?
c++ - std::map を初期化する必要がありますか?
イメージマネージャーであるシングルトンがあります。画像を読み込もうとすると、次のようにシングルトンを呼び出します。
そして、loadFromFile メソッドで、画像をマップに保存します。
問題は、mem アクセス エラーが発生することです。最初の文で例外がスローされるため、m_imageMap が NULL または間違った初期化の場合と同様です。しかし、私が言ったように、これはシングルトンなので、マップを初期化する必要があります。VC++ 2008 で開発しています。コンパイル/.obj ファイルが間違っている可能性がありますか?
これは昨日はうまくいきました
いくつかのアドバイス?
編集: m_imageMap の宣言は非常に単純です:
追加情報として、生成された例外はファイル output.c の 1643 行にあります。
編集さて、私はこのケースに非常に失望しています。コードを変更したので、クラスはシングルトンではなくなりました。m_imageMap のみが静的になり、ロードされたすべての画像がどこからでも見えるようになりました。しかし、それでも同じように失敗します。エラーはアクセス違反です。さらに、このコードですべてのメソッド コードを次のように変更すると、次のようになります。
それでも失敗します。マップがnullまたは何らかの方法でロックされているか、初期化が間違っているようですが、わかりません。私たちを手伝ってくれますか?
さらにコードが必要な場合は貼り付けますが、この 3 行でクラッシュすると問題が簡単になると思います。
編集:最終的に解決されました最終的に私はから変更しました
に
そして今、それは機能します。ここで、ポインターの静的 std::map の内容を削除する方法を考える必要があります。
皆さんに感謝します
c++ - 静的 std::map を削除する必要がありますか?
一部のクラスでは、内部にポインターを持つ静的な std::map があります。私の質問は、プログラムの最後に削除する必要があるかどうか、またはこのメモリが自動的に解放されるかどうかです。私の懸念は、 std::map が削除されたときに、内部に格納されているポインターがデストラクタを介して正しく削除されるかどうかです。
ありがとう。
c++ - std::map operator[] はどのようにして基本的なデータ型でメモリ リークを引き起こしますか?
Visual Leak Detectorを使用してメモリ リークを検出していますが、次のような行でメモリ リークの多くのインスタンスに遭遇しました。
これはどのように可能ですか?ここにはポインターがなく、オブジェクトのインスタンス化もありません。
他の何かが原因でプログラムがクラッシュしたことの副作用であるメモリリークでしょうか? プログラムがクラッシュしたり exit(1) したりすると、マップがきれいに破棄されなくなりますか?
c++ - value_typeとしてテンプレートファンクターへのポインターを使用したマップが機能しないのはなぜですか?
値の型がtemplate-functorへのポインターであるstd::mapを作成しようとすると、VisualStudioが中断します。私はここで違法なことをしていますか?
誰かがこれがエラーであるか(そしてなぜこれが間違っているのか)、それとも単なるVisual Studioであるかを教えてもらえますか?
c++ - 生のポインタなしでマップのキーをコピーすることは避けてください
キーがstd::stringであるstd::mapにペアを挿入するたびに、2つのコピーが作成されます。生のポインタの使用を避けることはできますが、例外として安全ではありません。生のポインターの代わりにスマートポインターを使用する方法はありますか?
コード例:
出力:
c++ - std::map ノードの配置
私は非常に驚くべきことに直面しています。(シナリオ: Win7 pro 64 ビット、VC2008 コンパイル 32 ビット コード)
メイン プログラムが std::map を使用するクラスをインスタンス化するとします。
これは std::map<std::string,Props> であり、クラス Props には 2 つのメンバーしかありません。
今...私はDLLを構築し、同じクラスを独自のビジネスに使用しています。
DLL はそのクラスをインスタンス化し、std::map をフィードします。
ええと...メインプログラムがマップにフィードすると、すべてがうまくいきますが、最初のアイテムの挿入後にDLLがクラッシュします。
何か(非常に興味深い)もっと。
メイン プログラムによって行われた挿入を深く掘り下げると、単一の _Node のコンストラクターに到達して std::map
_Node に次のように表示されます (c:\Programmi\Microsoft Visual Studio 9.0\VC\include\xtree)。
非常に細かい...つまり、_Node 構造は _Left (4 バイト)、_Parent (4 バイト)、_Right (4 バイト)、_Myval (キーのサイズとマップの値)、_Color (1 バイト)、および _Isnil (1 バイト) を持っています。
さて...マップにフィードしたい要素は、<std::string, Props> のペアです。
私のデバッガーによると、std::string には 0x20 バイトが必要ですが、Props は 8 バイトしか必要ありません。
ここで、デバッガーに単一ノードのサイズを尋ねると、0x38 であることがわかります。つまり...0x4 + 0x4 + 0x4 + 0x20 + 0x8 + 0x1 + 0x1 = 0x36 + パディング = 0x38 です。
これは、_Color メンバーが _Node の先頭から 0x34 バイト後に始まることを意味します。
(わかりました...すべてのプロジェクトで /Zp4 を使用するように指定したいので、すべての構造は 4 バイトでパックされます)。
続けてみましょう... DLL の動作をたどると、非常に驚くべきことがわかります。
std::map の _Buynode() メソッドは、アロケータを呼び出して、挿入しようとしている新しい要素の新しいサイズを取得します。_Node() インプレースコンストラクターが呼び出されるよりもアロケーターが呼び出されます....そして、別の方法で動作します!!
この場合、コンストラクターは、_Node の先頭から 0x38 バイトの後に _Color メンバーが開始するように動作します... あたかも別のパディングがあるかのように。
この後、新しい値を挿入しようとすると、_Color と _Isnil の値が間違っているため、手順は失敗します (メモリのその部分が初期化されていないため 0xcc)。
すべてのプロジェクトで /Zp4 をソリューションに設定したと確信しているので...
何が問題なのですか?
アラインメントに何か問題があると「感じ」ますが、何とも言えません...
前もって感謝します!
わかりました...さらに何かを追加します。
これは、c:\Programmi\Microsoft Visual Studio 9.0\VC\include\xtree の _Node 構造です。
ご覧のとおり、コンストラクターは非常に単純です。
前に言われたように、std::map を asf するときに、この構造体から使用されるメモリを調べます。
- _Left の場合は
4バイト - _Parent の場合は 4 バイト - _Right
の場合は 4 バイト
- _Myval の場合は 0x28 バイト (std::string の場合は 0x20、自分のクラスの場合は 8 です。確認したところ、alqays は 8 バイト
です) - _Color の場合は 1 バイト
- 1 _Isnil のバイト
ツリーの一番上 (つまり、一番左) に配置された新しい要素が作成されると、このコストラクタは、_Left、_Parent、_Right、_Myval を、初期化されていない 4 バイト分 (たとえば 0xcc で埋められている) よりも埋め、_Color と見なされるものを埋めます。および _Isnil 4 バイト先。
最もばかげたことは、std::map の他のメソッドがこれらの 4 バイトを「感じない」ことです。
これらは、デアサーションを引き起こす行です。
これは、_IsNil(_Ptr) のテストで _Isnil が 0xcc であることを検出するとエラーが発生するために発生します。リリース バージョンはおそらくおかしくありません。これは喜ばしいことではありません。
何か案が?
もう一歩!
ソリューション全体 (2 つの大きなプロジェクト、18 の小さなプロジェクト、約 250000 の C/C++ コード行) を取り、Linux (gcc4.1.2) でコンパイルしました。
すべてうまくいきます。何の問題もなく、std::map は適切に動作します。
Linux Makefile は、すべてをより簡単にすると同時に複雑にすると言わざるを得ません。自分ですべてを行わなければならないので複雑ですが、したくない場合は何も起こらないので簡単です。
これは私に 1 つのことを教えてくれます: Visual Studio 2008 には何か問題があり、特定の条件でステージ上でジャンプする何かがあります...問題は、「これを引き起こす条件は何ですか?」です。
アイデアを待っています...
insert - std :: map::insert問題
私は非常に単純で愚かな問題を抱えています:
コンパイラは言う:
TakeAction.cpp:43挿入呼び出しのある行です。楽しみのために私は次に試しました:
すべて同じです。
私はかなり混乱しています、説明してください、何が問題なのですか?
c++ - 演算子 [] 使用時の std::map segfaults
奇妙な問題があります。std::map を内部的に参照する工場登録パターンを使用しています。私はこのアプローチを複数のコンポーネントに使用しており、登録はさまざまなコンパイル単位 (別名 .cpp ファイル) の複数のポイントで行われます。これは、静的変数の初期化時 (「main」が呼び出される前) に発生します。何らかの奇妙な理由で、参照しているときにセグメンテーション違反が発生します
map[key] = value;
(基本的に、特定の pfn を登録するとき)。ここで、問題のある特定のコンポーネントの登録を同じコンパイル ユニットに移動すると、すべてが機能します。ここでも、コンポーネントの登録を 1 つだけ戻すと、segfault が発生します。
このパターンを使用するのはこれが初めてではなく、他のコンポーネントの同じ実行可能ファイルで機能します (つまり、別のファクトリ タイプの複数の .cpp にまたがるコンポーネントは、基本的に同様のソース コードを使用して、初期化時に問題なく登録されます)。 .
私は何をすべきか?今のところ、コンポーネントの登録を同じ .cpp に残しました (そして問題なく動作します)。どうすればもっとよく調査できますか?
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 を使用しています
スタックトレースの下