質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

エラーはありませんでした

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 513

notgoodpg

score 35

解決

「よくわからないけど直った」という最悪のパターンでheap corruptionも発生しなくなりました。
具体的にはDLL内で定義されたクラスの呼び出しを行う際、文字列が引数に含まれており
その文字列を直にコンストラクタ引数に書き込んでいたのを、一旦変数に定義してから与えるように変更したらheap corruptionが発生しなくなりました。

    // DllClass * c = new DllClass("literal", _T("literal"), false);
    const std::string literal = "literal";
    const CString mfcLiteral = _T("literal");
    DllClass * c = new DllClass(literal, mfcLiteral , false);

状況

今朝開発機を再起動してデバッグで動作させたところ
エラーはありませんでしたダイアログは表示されず、先に発生していたheap corruptionの問題だけが残りました。
手元で現象が再現しなくなってしまったためクローズにします。ご協力ありがとうございました。

heap corruptionの問題

DLLは静的リンクで呼び出し

  • DLLから呼び出したクラスのメンバ関数を使わずにnewとdeleteだけ行う
    -> 効果なし、heap corruption発生
  • さらにprivate: const CString m_str;なメンバーのconstをはずす
    ->効果なし、heap corruption発生
  • さらにコンストラクタ内で何の処理も行わなくする
    -> 効果なし、heap corruption発生
  • 新しくダイアログベースのプロジェクトを作成し、問題が発生しているプロジェクトと同じタイミングでDLLをnew,deleteする
    ->再現できず。heap corruption発生せず
  • DLLの参照を外し、DLLの内容を該当プログラムにコピペ
    ->再現できず。正常に動作するためソースには問題がないと思われる。DLLとして利用していることが原因?

憶測

  • DLLを使用することで発生?DLL側に問題はない(同じDLLを使用している別プログラムではheap corruptionが発生しない)のでDLLの呼び出し側の問題?
  • DLLで使用すると予測不能な不具合を発生させる型が存在するという情報を見かけた(参考URLを控え忘れたので提示できないですが・・・)。ただDLLを使用する別プログラムでは発生しないので原因はかなり込み入ったところにある?

コールスタック?

私のDLLのデバッグ方法が間違っていたようです。
ただ

デバッガでアタッチしてコールスタックみればいいのではないでしょうか

との指摘を受け調べたものの実施するにあたってどういう手順を踏めば良いのかよくわからないため進展せずです。

参考...
Heap corruption when returning from function inside a dll|StackOverflow(リーディングスキル不足により内容を理解できず・・・)

本文

宜しくお願いいたします。

前提・実現したいこと

VisualStudioで開発中のC++/MFCアプリがDebug実行中に意味深なダイアログを表示します
ダイアログの意味や表示される原因をご存知の方、どうか教えてください。

業務で作成中のダイアログベースプログラムにおいて
メインダイアログクラスAOnInitDialog内で
とあるクラスBのコンストラクタを呼び
その中で自作DLLでIniファイルからの呼び出しを行う処理を行おうとしたのですが
heap corruptionが発生していることが判明し
原因の切り分けを進めるうち
DLLから静的リンクで呼び出したクラスZのコンストラクタが原因っぽい?という結論に至りました
そこでその部分だけクラスBのコンストラクタから抜き出し
別途関数を作成してその中にペーストし
クラスBコンストラクタを実行したあとでその関数を呼び出すようにしました。

そのとき、heap corruptionは発生しないもののエラーはありませんでしたというダイアログが表示されたのです。
はじめてみるだけならともかく意味不明で
DLLやソリューションにそのようなダイアログを表示する記述がないか探しましたが、存在しませんでした。

前置きが長くなりましたが、このエラーはありませんでしたダイアログが誰によって表示され
どのような意図のダイアログであるかをご存知の方はどうか教えてください。

heap corruptionについては実際のところ別途検証用プログラムで同様の現象が発生しなかったため
原因の切り分けも完全に無駄だったと判明し全く解決していないのですが
ともかく一番最後に出てきたの異常からひとつひとつ解決したいと考えています。
宜しくお願いいたします。

発生している問題・エラーメッセージ

エラーはありませんでした

該当のソースコード

非常に長い上ネット上に公開するのは問題になる可能性があるので公開はしません。
エラーはありませんでしたを見たことがある、このように対処した
という情報をいただければ片っ端から試してみたいと考えています。

補足情報(FW/ツールのバージョンなど)

  • Windows7/64bit SP
  • VisualStudio2015 SP1
  • C++/MFC
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/03/19 20:46

    ヒープ汚染というのが意味不明です。どういうことでしょうか

    キャンセル

  • notgoodpg

    2019/03/20 09:04 編集

    Heap corruptionのことです。ヒープ汚染とは呼ばないんですね。ややこしいので日本語に直さないほうがいいですね。ヒープ破壊やヒープの破損でも意味不明ですし。

    キャンセル

回答 1

checkベストアンサー

+1

デバッガでアタッチしてコールスタックみればいいのではないでしょうか


追記
heap corruptionについて、
DLL・EXEのランタイムライブラリをマルチスレッドDLL版にしてみると直りそうな気がします

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/19 19:04 編集

    ありがとうございます。
    呼び出し履歴ではソリューション内で参照可能な呼び出しが表示されませんでした。

    (もう何年もやってるのにあまり身についてない用語で不安なのですが
    デバッガでアタッチ->ブレークポイントで停止
    コールスタック->呼び出し履歴 であってますか?)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる