CRecordsetクラスのdelete時のヒープエラー – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] CRecordsetクラスのdelete時のヒープエラー

固定ページ 2 / 2

おみおみ
 おみおみ
(@おみおみ)
ゲスト
結合: 20年前
投稿: 20
Topic starter  

やっと原因が分かりました。

[DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー]
http://msdn2.microsoft.com/ja-jp/library/ms235460.aspx

Exe側でnewもdeleteもしているのですが、継承しているため、どちらかがDLLで実行され
ているということなのでしょうか。

問題となっているDLL,ExeはMFC DLLをスタティックリンクしており、共有DLLにすれば発
生しないという情報があり、試しにDLL、Exeとも共有DLLを使用するようにしたところ、
症状は起きなくなりました。スタティックリンクするとCRTライブラリに相違が生じるの
でしょうか。

どちらにしろ私の能力では危険が多そうなので、DLLをスタティックリンクライブラリに
しました。というかもともとスタティックリンクライブラリをDLLにしようとしていたの
で、今回はそれをやめることにしました。

おつきあいどうもありがとうございました。

ちなみにnewしていたのはメモリ量の問題ではなく、
ポリモルフィズムしていたので、動的に生成する必要がありました。
まあnewしなくてもいい方法もあるのかもしれませんが、
そうであってもdeleteするとエラーになるというのはちょっと嫌でした。


返信引用
おみおみ
 おみおみ
(@おみおみ)
ゲスト
結合: 20年前
投稿: 20
Topic starter  

やっと原因が分かりました。

[DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー]
http://msdn2.microsoft.com/ja-jp/library/ms235460.aspx

Exe側でnewもdeleteもしているのですが、継承しているため、どちらかがDLLで実行され
ているということなのでしょうか。

問題となっているDLL,ExeはMFC DLLをスタティックリンクしており、共有DLLにすれば発
生しないという情報があり、試しにDLL、Exeとも共有DLLを使用するようにしたところ、
症状は起きなくなりました。スタティックリンクするとCRTライブラリに相違が生じるの
でしょうか。

どちらにしろ私の能力では危険が多そうなので、DLLをスタティックリンクライブラリに
しました。というかもともとスタティックリンクライブラリをDLLにしようとしていたの
で、今回はそれをやめることにしました。

おつきあいどうもありがとうございました。

ちなみにnewしていたのはメモリ量の問題ではなく、
ポリモルフィズムしていたので、動的に生成する必要がありました。
まあnewしなくてもいい方法もあるのかもしれませんが、
そうであってもdeleteするとエラーになるというのはちょっと嫌でした。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

MFCライブラリをスタティックリンクしてしまうと
各々でライブラリの初期化や状態の保持が行われてしまう為に
おかしくなると思います。
DLLで構成するのであれば、MFCもDLLで使うべきだと思います。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 23年前
投稿: 1235
 

今回、MFC拡張DLLですよね。
PATIOさんのご意見どおり、共有DLLじゃないと駄目みたいですね。
古いですが
http://www.microsoft.com/japan/developer/library/vccore/_core_extension_dlls.3a
_.overview.htm
新しい方
http://msdn2.microsoft.com/ja-JP/library/20ytt2wa.aspx

ぐぐってみるとたくさんありますね
MSDNのほうがいいかと思ったので参考にどうぞ
古いほうが詳しく書いてそうですね。


返信引用
おみおみ
 おみおみ
(@おみおみ)
ゲスト
結合: 20年前
投稿: 20
Topic starter  

情報ありがとうございます。

>今回、MFC拡張DLLですよね。

いや、プロジェクト作成時に「MFCをスタティックにリンクした通常のDLL」というのを
選択しました。
おそらくこれ↓ですね。

http://msdn2.microsoft.com/ja-JP/library/f22wcbea.aspx

中盤のこの記述が関連してそうですね。
-------------------------------------------------------
レギュラー DLL 内のメモリ割り当てはすべて、DLL の範囲内に収める必要があります。
したがって、以下のポインタを呼び出し側の実行可能ファイルとやり取りすることはで
きません。

MFC オブジェクトへのポインタ

MFC によって割り当てられたメモリへのポインタ

呼び出し元の実行可能ファイルと DLL との間で上のポインタや MFC 派生オブジェクト
をやり取りする場合は、拡張 DLL を作成する必要があります。
-------------------------------------------------------

今回は勉強になりました。ありがとうございます。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました