◀ANSI版開発トップへ
  • 3273 CProfile cProfile; が変?
    • 3277 RE: CProfile cProfile; が変?
      • 3280 Re2: CProfile cProfile; が変?
    • 3283 Re:CProfile cProfile; が変?
      • 3284 訂正
  • [3273] CProfile cProfile; が変? KEITA 2003年10月22日 21:31

    AMD64版自ら公開しておきながら未テストのままでしたが、
    Athlon64 + XP64bit-Edition(beta)で試しましたら、
    どうもコントロールプロセスの起動に失敗。

    今、調査したところ、CShareData_new.cpp の中の

    CProfile cProfile;

    でNGになっているようです。まだしっかりと見ていませんが、
    とりあえず乱暴ながらも関数の外に出す(グローバル)と正常に
    動作はしますが...

    はてさて...いかがなもんでしょう?

    他にもCPropTypes.cpp内にも2ヶ所、カラーのインポート、
    エクスポートの部分も同様です。
    • [3277] RE: CProfile cProfile; が変? もか 2003年10月23日 20:09

      >Athlon64 + XP64bit-Edition(beta)で
      >CShareData_new.cpp の中の
      >CProfile cProfile;
      >でNGになっているようです。まだしっかりと見ていませんが、
      >とりあえず乱暴ながらも関数の外に出す(グローバル)と正常に
      >動作はしますが...
      CProfileの64bit版での大きさをざっと計算してみたら、1MB超えます。
      そのためスタックに入らないのだと思います。
      *1. CProfileを動的確保に
      CProfile cProfile;
      を以下のように書くとか
      CProfile& cProfile = *(new CProfile());
      スコープの最後で「delete &cProfile;」するのを忘れずに。
      *2. 丁度いいタイミングでdskobaさんが作ってくれたSTL版を使う
      のどちらかが良いと思います。

      #AMD64版のスタックサイズはいくつなんでしょうか?
      #デフォルト値がまさか1MBのままだったりして。
      • [3280] Re2: CProfile cProfile; が変? KEITA 2003年10月24日 11:46

        > #AMD64版のスタックサイズはいくつなんでしょうか?
        > #デフォルト値がまさか1MBのままだったりして。

         やはり、そのまさかでした。(^^;

        IA64が正常に動作するので、スタックの問題も考えにくいなと
        思ったのですが、どうもAMD64向けコンパイラはまだBetaのためか、
        1MBのままのようですね。

        LINKオプションで、IA64,AMD64共に
        /STACK:1049000 を指定すると、OK
        /STACK:1048000 を指定すると、NG
        になるようです。
        48KB強ほどオーバーしていることになりますね。

        ということはIA64版コンパイラは、しっかり初期値が増やされて
        いて問題が表面化しなかったことになります。

        とりあえず、LINKオプションで対応したAMD64版とバッチファイル
        の更新版はJunkに入れておきました。
        http://www.egroups.co.jp/files/sakura-editor/Junk/

        ちなみに
        CProfile& cProfile = *(new CProfile());
        delete &cProfile;
        の組み合わせでもOKですし、dskobaさんのSTL版でもOKになる
        はずですが、ちょっとテストしましたところ、まだAMD64版コン
        パイラ側が十分に対応しきれていないようです。あまり突っ込む
        とコンパイラのテスターになってしまうので、このあたりで
        止めておきます。
    • [3283] Re:CProfile cProfile; が変? dskoba 2003年10月25日 17:09

      CProfileを(STL版を使わずに)変更することで対処するなら

      CMemory* m_pDataNameArr[MAX_SECNUM][MAX_SECDATA]
      をやめて
      CMemory*** m_pDataNameArr;
      として

      CProfile::CProfile()
      {
      m_pDataNameArr = new CMemory**[MAX_SECNUM];
      for(int i = 0; i < MAX_SECNUM; ++i ){
      m_pDataNameArr[i] = new CMemory*[MAX_SECDATA];
      for(int j = 0; j < MAX_SECDATA; ++j ){
      m_pDataNameArr[i][j] = NULL;
      }
      }
      }

      CProfile::~CProfile()
      {
      for(int i = 0; i < MAX_SECNUM; ++i ){
      for(int j = 0; j < MAX_SECDATA; ++j ){
      if( NULL != m_pDataNameArr[i][j] ){
      delete m_pDataNameArr[i][j];
      }
      }
      delete m_pDataNameArr[i];
      }
      delete m_pDataNameArr;
      }
      m_pSecNameArr, m_pDataArr も同様に動的確保へ変更する
      • [3284] 訂正 dskoba 2003年10月26日 02:30

        CProfile::~CProfile()
        {
        for(int i = 0; i < MAX_SECNUM; ++i ){
        for(int j = 0; j < MAX_SECDATA; ++j ){
        if( NULL != m_pDataNameArr[i][j] ){
        delete m_pDataNameArr[i][j];
        }
        }
        delete[] m_pDataNameArr[i];
        }
        delete[] m_pDataNameArr;
        }

        delete ではなく delete[] でした。