0

xlslib ライブラリ ( http://sourceforge.net/projects/xlslib/ ) を Windows MFC プログラム (VC 2010) で動作させようとしています。生成された Excel ファイルは多少大きくなる可能性があり、ダイアログを閉じずに複数の Excel ファイルを書き込めるようにする必要があるため、問題が発生しました。

ルートクラスは「ワークブック」と呼ばれます。私は最初に宣言しました:

workbook xls;

Excelエクスポートを処理する関数で、スタックを爆破しました。xls が大きくなりすぎました。

次の試行では、ダイアログのクラス定義で m_xls を宣言しましたが、呼び出し間で m_xls をクリアする方法がわかりません。ダイアログが開いているときに Excel エクスポートを複数回実行すると、最初の実行からのデータが終了します。 2 回目、3 回目は 1 回目と 2 回目からデータを取得します。

エクスポート機能の最後に初回実行時のデータをクリアしてみました。クラスのデコンストラクターで、メインのデータ ストレージ ベクトルからデータを削除するために何が行われたかを調べました。ワークブック クラスは非常に複雑で、多くのサブクラスがあり、Excel コードを最初に実行した後 (データを消去した後)、プログラムをいつ試しても非常に不安定になり、ワークブックを終了するとスレッド プール関数でアサートが発生します。プログラムと、出力ウィンドウに多数の初回例外が表示されます。

最後に、クラスでワークブック ポインターを宣言し、次のようにワークブックを動的に割り当てました。

m_pxls = new workbook;

関数の開始時。最後に、delete で割り当てを解除します。

delete m_pxls;

これにより、次のエラー メッセージが表示されてプログラムが中断されます。

HEAP[Program.exe]: Heap block at 06329360 modified at 0632950A past requested size of 1a2
Windows has triggered a breakpoint in Program.exe.

This may be due to a corruption of the heap, which indicates a bug in Program.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while Program.exe has focus.

The output window may have more diagnostic information.

割り当てられたのはデータのない基本クラスだけで、xlslib の関数によって追加されたすべてのデータは、割り当てられたメモリの範囲を超えていたようです。たぶん私は何かを誤解していますが、ワークブックのデコンストラクターとそのすべてのサブクラスは、メモリの割り当てが解除されたときに呼び出されませんか?

ここで、次の 2 つのことのいずれかを行う方法を理解する必要があります。

1) Excel コードへのさらなる呼び出しで、クラス定義で静的に宣言された m_xls を再初期化する方法を理解します。また

2) 割り当てと割り当て解除で何が起こっているかを把握し、新規/削除が適切に機能するようにします。

私はしばらくの間プログラミングを行ってきましたが、これまで経験したことのないメモリ管理のニュアンスに入ります。私はおそらく知っておくべき新規/削除について明らかな何かを見逃していることを知っています...

前もって感謝します

4

0 に答える 0