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

 
fxsaber:
デストラクタが何のためにあるかは知っている。なぜ、仮想という言葉を定義の前に書かなければならないのか、私にはよくわかりません。
C++ではデストラクタが異なるため、コードの互換性のために必要です。
 
A100:
C++ではデストラクタが異なるため、コードの互換性のために必要です。
了解です、ありがとうございます。MQL5への移植は多いのでしょうか?- 例が具体的なのはそのためですか?
 
fxsaber:
デストラクタが何に使われるかは知っている。なぜ、定義の前にバーチャルという言葉を付けなければならないのか、理解できない。

仮想関数とデストラクタ >>

基本的なルールとして、クラス内に少なくとも1つの仮想関数がある場合は、デストラクタも仮想にする必要があります。デストラクタはデフォルトではvirtualではないので、明示的に宣言する必要があることを覚えておいてください。これをしないと、ほぼ間違いなくプログラムにメモリリークが発生します。この理由もまた、知性を必要としない。いくつかの例を見てみましょう。

 
fxsaber:
了解です、ありがとうございます。MQL5への移植は多いのでしょうか?- 例が具体的なのはそのためですか?
移植はあまりしない。一見しただけで具体的専門家」の中には、3つ以上の派生クラスは 有害であるとここに書いている人もいます。私は、適切な初期化が必要な基本クラスが3~4個しかなく、その後に本当のデリバティブが来ることが多いのです。
 
int main()
{
    A * pA = new B;
    delete pA;
    return EXIT_SUCCESS;
}

このとき、オブジェクトは正常に構築されますが、破壊されるとき、派生クラスのデストラクタが呼ばれないため、メモリリークが発生します。

削除はベースクラスへのポインタを介して行われ、コンパイラはデストラクタを呼び出すためにアーリーバインディングを使用するからである。ベースクラスのデストラクタは、派生クラスのデストラクタについて何も知らないので、呼び出すことができません。そ の結果、派生クラス用に確保されたメモリの一部が回復不能な状態で失われる。

これを避けるためには、ベースクラス内のデストラクタをvirtualに宣言 する必要があります。

ベースとなるデストラクタを仮想化することで、派生するデストラクタの情報が表示される理由がアーキテクチャ的に理解できない。

ベースが仮想の場合、派生デストラクタを定義することで、ベースのデストラクタを派生デストラクタに置き換えることになると理解しています。しかし、その場合、この例ではベースのデストラクタは呼ばれないはずです。

明らかに、この仕組みが理解できていない。MQL5で仮想関数に問題があったことはありません。私は彼らのおかげでOOPがたくさん好きになりました。すべて理解したつもりでいた。今、私は完全にジレンマに陥っています。ぜひ、自分の言葉で説明してください。

 
A100:
小さく描くこと。一見しただけで具体的専門家の中には、3つ以上の派生クラスは 有害であるとここに書いている人もいました。私はよく、3-4個の基本クラスを適切に初期化し、その後に本当のデリバティブを開始します。
プロが(私から見て)MQL5でどのように書いているのか、例を示してほしい。
 
fxsaber:

しかし、その場合、この例ではベースのデストラクタは呼ばれないはずです。

派生したデストラクタから暗黙のうちに呼び出されます。実はここが、単純な仮想関数と 違うところです。
 
Комбинатор:
派生したデストラクタから暗黙のうちに呼び出されます。実はそこが単純な仮想関数と 違うところなんです。
ありがとうございます。仮想デストラクタは、オブジェクトが破壊されるときに呼び出される単なる仮想関数ではなく、もっとやっかいな存在であることがわかったのです。
 
fxsaber:
オブジェクトを削除する必要があります。
 
Alexey Kozitsyn:

SymbolInfoTick() が無関係なデータを返すエラー - tickのオーバーシュート。Build 1525 x64。インジケータからのテスト、Expert Advisorでのテストはしていません。

リアル、オープニング、アクセスサーバーV。悲報!問題点に注目してください。また、申請番号1598238の 問題(10ページ目から、2017.01.26 09:43の投稿)にもです。

開発者の皆さん、ダニを直しましょう!コードが提供され、それがここにある - 問題、何も探す必要はありません、ただ反応して、それを解決してください

OnCalculateをOnTickに置き換えると、エラーは発生しません。問題はSymbolInfoTickにあるのではなく、インジケータがスキップしないように曲がった設定になっていることです。
理由: