エラー、バグ、質問 - ページ 1875

 

おそらくOnStart()関数の 中で手動で呼び出しているからだと思います。

静的オブジェクトのデストラクタは、この関数の後に宣言と逆の順序で呼び出されます。

 
Koldun Zloy:

おそらくOnStart()関数の 中で手動で呼び出しているからだと思います。

静的オブジェクトのデストラクタは、この関数の後に宣言と逆の順序で呼び出されます。

ここでは、すべてが正しく動作するはずだと思われます
template <typename T>
struct PTR
{
  T* Ptr;
  
  PTR( void )
  {
  }
  
  void operator =( T* &Value )
  {
    this.Ptr = Value;
  }
  
  ~PTR( void )
  {
    Print(__FUNCSIG__);
    delete this.Ptr;
  }
};

class CLASS
{
private:
  static PTR<CLASS> Ptr;
  static CLASS* Tmp;
  
  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }
};

static PTR<CLASS> CLASS::Ptr;
static CLASS* CLASS::Tmp = new CLASS;

void OnStart()
{
}

しかし、漏れは発生する。どこに問題があるのか?

 
fxsaber:
ここでは、すべてが正しく動作する必要があると思います。

しかし、漏れは起きている。どこに問題があるのか?


2つのオブジェクトを作成し、1つだけ削除します。

なぜCLASS::Tmp オブジェクトが必要なのですか?

 
Koldun Zloy:


2つのオブジェクトを作成し、1つだけ削除します。

どの時点で2つのオブジェクトが作成されるのか?

なぜCLASS::Tmp オブジェクトが必要なのですか?

おかげさまで、その必要はありません。しかし、言葉を理解するためには、やはり例によってなぜ漏れが発生するのかを理解したいものです。

隠しコンストラクタを持つ隠しオブジェクトは、場合によっては論理的ですが(おそらく最も浸透しているもの だと思います)。

 

はい、勘違いしてました。オブジェクトが1つだけ作成され、削除されないのですね。

なぜなら、コンストラクタを呼び出すときに

  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }

CLASS::Tmpには、オブジェクトのアドレスではなく、ゴミが入ったままです。

 
1) 構造体 static PTR<CLASS> CLASS::Ptr が生成される.
2) クラスが作成され、new CLASSとなり、コンストラクタCLASS()が実行され、CLASS::PtrにNullが代入される。
3) CLASS::Tmp の値は、新しい CLASS へのポインタによって更新される。
4) PTR<CLASS> 構造体 CLASS::Ptr を削除;デストラクタを実行し、CLASS::Ptr を削除しようとする(それは Null である)。
 
Koldun Zloy:

CLASS::Tmpには、オブジェクトのアドレスではなく、ゴミが入ったままです。

ありがとうございました。この当たり前のことに、なぜか気がつかなかった。

セルゲイ・デジュブリク
1) 構造体 static PTR<CLASS> CLASS::Ptr が生成される.
2) クラス new CLASS を作成し、コンストラクタ CLASS() を実行し、CLASS::Ptr に Null を代入する。
3) CLASS::Tmp の値は、新しい CLASS へのポインタによって更新される。
4) PTR<CLASS> 構造体 CLASS::Ptr を削除;デストラクタを実行し、CLASS::Ptr を削除しようとする(それは Null である)。

ありがとうございます。でも、Nullじゃなくてゴミなんだよね。

 

モードがあれば良いと思います。

ChartSetInteger( 0,CHART_SHOW,false );

モードでは、トレード(エントリー/イグジット)の矢印が表示されませんでした。そこに必要なものはまったくないのです。

 
私は初心者で、仕事を頼みたいのですが、残高が0になってしまいました。
 
The service is unavailable.
バレリアンティンクチャーを買いに行ってきた...(
理由: