Класс CArrayObj обеспечивает возможность работы с динамическим массивом указателей на экземпляры класса CObject и его наследников. Это дает возможность работы как с многомерными динамическими массивами примитивных типов данных, так и с более сложно организованными структурами данных. В классе реализованы возможности добавления/вставки/удаления...
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
AddValueではnewでオブジェクトのコピーを作成しますが、デストラクタでそれを解放せず、ポインタのリストをクリアするだけです。
ヘルプによると、デストラクタを呼び出すと、使用したクラスのデストラクタもまた
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
スクリプトがアンロードされた後、破壊されていないオブジェクトに関する警告をターミナルがログに書き込まなかったケースを覚えていません。
次に、代入演算子ではなく、コピーコンストラクタで正しく行うべきでした。しかし、これはすべてIMHOです)
MQLの単純な構造体やクラスは必ず問題なくコピーされるという開発者の情報を見つけ、何度か確認しましたが、言語機能を使う限りはその通りのようです
MQLはC++ではない、両者の類似性を探すのはやめた、開発者はこう実装している、確認した、動く、だから使っていい、と書いている。
AddValueではnewでオブジェクトのコピーを作成しますが、デストラクタではそれらを解放せず、ポインタリストをクリアするだけです。
あら、そうなの!?また、デストラクタのnewで生成されたクラスのインスタンスを削除するにはどうすればよいのでしょうか?してみてください。うまくいきません。
他のクラスのデストラクタの中でしかできません。
やばい!また、デストラクタのnewで生成されたクラスのインスタンスを削除するにはどうすればよいのでしょうか?試してみてはいかがでしょうか。うまくいきません。
他のクラスのデストラクタでのみ可能です。
別クラスのデストラクタの話でした。AddValue メソッドでnewして作成されたアイテムについて述べています。
ヘルプによると、デストラクタが呼ばれたときに、使用されたクラスのデストラクタも
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
スクリプトがアンロードされた後、ターミナルが破壊されていないオブジェクトについての警告をログに書き込まなかったケースを覚えていません。
開発者から、MQLの単純な構造体やクラスは常に問題なくコピーされると聞き、何度か確認したところ、どうやら本当のようです。
MQLはC++ではありません。私は両者の類似性を探すのをやめました。開発者は、これが実装方法であると書いています。
はい、ヘルプで見ました...。非常に暗黙的なもので、unique_ptrの代わりに松葉杖のように見えますが...。
はい......ヘルプで見ました......。非常に暗黙的なもので、unique_ptrの代わりに松葉杖のようなもの...。
しかも、松葉杖とは呼べないほど便利なんです。
任意のクラスのオブジェクトを作成し、ストレージリストに入れれば、もうそれを削除する心配はありません - ターミナルサブシステムが勝手に掃除してくれます。
しかし、いつ、どこで、どのような目的で作成されたのか、今必要なのかを追跡しようと、新しく作成されたすべてのオブジェクトに対して手動操作と「実行」を設定することも可能です。不要な場合は、削除してください。しかし、間違えてしまった時に、それが必要だったことが判明する。無効なポインタにアクセスするとクラッシュする...。
つまり、松葉杖は、役に立たないものを探して「オブジェクトを追いかける」だけで、どこかのオブジェクトが追いついていないとメモリーリークを心配することになります。
次に、正しい方法は、代入演算子の代わりにコピーコンストラクタを使用することです。ただし、これはすべてIMHO)
このテンプレートに正しくコピーするための例を教えてください。
AddValueメソッドの記述にヘルプを使用しましたhttps://www.mql5.com/ru/docs/basis/types/classes
頭を悩ませましたが、MQLには例題に書いたような解決策しか見当たりません
正しいデータ保存の実装を見せてください
しかも、松葉杖とは呼べないほど便利なんです。
どのようなクラスのオブジェクトでも作成し、ストレージリストに入れれば、もう削除する心配はない。ターミナルサブシステムが勝手に掃除してくれる。
しかし、手動操作を設定し、新しく作成されたすべてのオブジェクトに対して、いつ、どこで、どのような目的で作成されたのか、今必要なのかどうかを調べるために「実行」することも可能です。不要な場合は、削除してください。しかし、間違えてしまった時に、それが必要だったことが判明する。無効なポインタにアクセスするとクラッシュする...。
つまり、松葉杖は、役に立たないものを探して「オブジェクトを追いかける」だけで、どこかのオブジェクトが追いついていないとメモリーリークを心配することになります。
ここでのポイントは、一度コレクションにポインタを追加すると、そのポインタも一緒に残るということです。それがまず第一です。
ヘルプによると、デストラクタが呼ばれたときに、使用されているクラスのデストラクタも呼ばれます
https://www.mql5.com/ru/docs/standardlibrary/datastructures/carrayobj#carrayobjfeatures
スクリプトがアンロードされた後、ターミナルが破壊されていないオブジェクトについての警告をログに書き込まなかったケースを覚えていません。
開発者から、MQLの単純な構造体やクラスは常に問題なくコピーされると聞き、何度か確認したところ、どうやら本当のようです。
MQLはC++ではありません。両者の類似性を探すのはあきらめました。開発者は、このように実装されていると書きました。私はそれを確認し、動作しました。ですから、標準のC++構文が重要であれば、.dllで簡単にすべての論理を記述して使用できます
これで三角形のアレイが作れるのか?
言語の制限もあり、まともなものが動くとは思えません。私はこの松葉杖(標準的な配列の上の軽量ラッパー)を持っています。
ポインタを格納するには、unic_ptrのラッパーを書きます(本格的なものは無理ですが、最低でもauto_ptr)。私見では、このプリミティブでも、stdのテンプレート対応よりずっと便利だと思います。