やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GTKmmでfstreamを使うと実行時エラーになってしまう

前回のつづき。Gtk::EntryでEnterキー押下したときファイル書込したかった。 しかし、表題の件で失敗した。

Window

デバッガでの実行時エラー。

Debugger

exeでの実行時エラー。

Exe

入手先

GitHub MEGA

開発環境

ライブラリ

症状

fstreamのclose()時に実行時エラー(アクセス違反)が発生してアプリが強制終了してしまう。

原因

  • GTKはマルチスレッドらしい
  • STLはスレッドセーフではないらしい
  • fstreamはSTLのclass

マルチスレッドなGTKフレームワーク上でスレッドセーフではないクラスを使ったからエラーになったと思われる。

試行パターン

GitHubで公開しているコードは以下のパターンである。

  • Gtk::Entry::on_activate()時にfstreamを生成→書込→closeする

ほかにも、以下のパターンを試した。 GitHubで公開したコードではコメントアウトしてある。

  • Gtk::Window継承クラスのメンバ変数にfstreamをもたせる
    • fstream::close()をGtk::Window::on_delete_event時に実行する
    • fstream::close()をGtk::Window::~Window時に実行する

いずれも実行時エラー(アクセス違反)になった。

コード

MyWindow.h

MyWindow.cpp

対策

fstreamが使えなくとも何とかなると思いたい。 ひとつずつ試してみるしかないか。

Boostは導入が面倒そう。 もしvectorクラスなどほかのSTLも全滅なら試してみる価値はあるかも。

所感

せっかくgtk+からgtkmmにしてC++が使えるようになったのに、fstreamが使えない…。 たぶんgiommで解決できるはずだからC++でできるのだろうけど。

もし他のSTLも使えなかったら残念すぎる。 代用のライブラリがgtkmmに全部あれば楽だけど。

またしても調査が大変な予感。 たかがファイル入出力に、一体いくつものやり方があるのやら。 自力で原因を突き止めて、対処方法をしらべて、環境を用意して、試してみる。 この過程が大変。

環境次第で使えないSTLこと"標準"テンプレートライブラリ。標準とは一体…。 ほかにやり方があるのだろうか。 C#なら一発で解決できるに違いない。

ひとつずつやるしかないか。