mql5言語の特徴、微妙なニュアンスとテクニック - ページ 217

 
fxsaber #:
今、(b3110)複雑な構造をゼロにするにはどうしたらいいのでしょうか?

ゼロ点を持つコンストラクタです。

また、進行中にゼロにしたい場合は、その方法も追加されています。

struct MqlTick2 : private MqlTick
{
        string Str; // С этой строкой не обнулить.

        MqlTick2()
        {
                Init();
        }
        void Init()
        {
                Str = NULL;
        };
};

void OnStart()
{
        MqlTick2 tick;
        Print( tick.Str );  // NULL
        tick.Str = "123";
        Print( tick.Str );  // "123"
        tick.Init();
        Print( tick.Str );  // NULL
}
 
Andrey Khatimlianskii #:

ゼロ点を持つコンストラクタです。

また、仕事中にゼロにしたい場合は、そのための方法を追加します。

かつてZeroMemoryが許したように、普遍的な方法が欲しい。

 
A100 #:

x[i].i == 0 の第1項をチェックするようにした(以前は x[i].x == 0.0 という条件だった)。

結果:false

そしてZeroMemoryで-本当です。

ありがとうございます、修正しました。

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5の特性、ヒントとコツ

mktr8591, 2021.08.12 19:43

保留期限を設定した。その後、手動やスクリプトで変更すると、ORDER_TIME_SETUPが 変更されます。

何が変わるのかの例

設定ログです。

QG      0       22:00:02.376    Trades  '93912': accepted buy limit 13.1 AUDUSD at 0.71897 tp: 0.71927
IS      0       22:00:02.378    Trades  '93912': order #5774292 buy limit 13.1 / 13.1 AUDUSD at 0.71897 done in 33.487 ms

ORDER_TIME_SETUPを変更 しました。バグ?

 
fxsaber #:

かつてZeroMemoryが許したように、普遍的な方法が欲しい。

そして、誰がストリングスのバッファを解放するのでしょうか?ZeroMemoryは、基本的にこのアナログです。

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366920(v=vs.85)

デストラクタは呼び出されない。これに対応して、バッファポインタは文字列でクリアされ、バッファ自体はリークされることになる。メモリを使ったダイレクトワークは地雷原のようなもので、警戒心を失えばそれまでです)))

ここでは、あなたの場合のリーク例を紹介します。

#include <iostream>
#include <string>
#include <cstring>

int main()
{
    std::string example{"Leaked memory!!!"};
    std::cout<<"First: "<<example<<std::endl;
    const char* data=example.data();
    std::memset(&example,0,sizeof(example));
    std::cout<<"Second: "<<example<<std::endl;
    std::cout<<"Third: "<<data<<std::endl;
    return 0;
}
First: Leaked memory!!!
Second: 
Third: Leaked memory!!!

オブジェクトはもはやバッファへのポインタを持たず、バッファそのものが "リーク "したのです。

PS.memsetとZeroMemoryでPOD型がゼロにならないのはクソ。

 
Vladimir Simakov #:

PS.PODタイプではなく、memsetとZeroMemoryを 使ったゼロ化です。

テストはしていませんが、文字列バッファがゼロになるのだと思います。

 
fxsaber #:

確認していませんが、文字列バッファがリセットされているのではないでしょうか。

なぜリセットされるのか)))

#import "CPPTestDll.dll"
        long GetAddress(string &ptr);
        string Text(long data);
#import

struct A{
   string a;
   int b;
};

void OnStart()
{
  string t1="Test";
  string t2="text";
  Print(t1);
  Print(t2);
  A a={"",8};
  a.a+=t1+" "+t2;
  long ptr=GetAddress(a.a);
  Print(a.a," | ",a.b);
  Print(Text(ptr));
  Print("-------------------------");
  ZeroMemory(a);
  Print(a.a," | ",a.b);
  Print(Text(ptr));
}


2021.11.28 14:49:29.354 test (EURUSD,H4)        Test
2021.11.28 14:49:29.354 test (EURUSD,H4)        text
2021.11.28 14:49:29.354 test (EURUSD,H4)        Test text | 8
2021.11.28 14:49:29.354 test (EURUSD,H4)        Test text
2021.11.28 14:49:29.354 test (EURUSD,H4)        -------------------------
2021.11.28 14:49:29.354 test (EURUSD,H4)         | 0
2021.11.28 14:49:29.354 test (EURUSD,H4)        Test text

さすがに大人っぽいですね)))

UPD: t1, t2 とその出力。コンパイラが全体を最適化し過ぎないようにするため)

UPD2: バッファの削除は可能だが、文字列が構造体の中にある場合の削除方法がわからない。

UPD3: ヘルプに書いてありますが、個人的に呼び出したので、バッファが解放されるはずですが、解放されたメモリへのポインタで、すでにデータを読み込んでいるのでしょうね。

ファイル:
 
Vladimir Simakov #:

なぜ自分をゼロにリセットするのだろう))

が見られると良いですね。

Print(GetAddress(a.a));

ビフォーアフター

 
fxsaber #:

が見られると良いですね。

ビフォーアフター

当然のことですが。最初の場合はメモリアドレス,2番目の場合は0

 
Vladimir Simakov #:

なんでリセットしたんだろう)))


ここにあるものはすべて、当然のように成熟して います)))

UPD: t1, t2 とその出力。コンパイラが全体を最適化し過ぎないようにするため)

UPD2: バッファの削除は可能だが、文字列が構造体の中にある場合の削除 方法がわからない。

UPD3: ヘルプに書いてありますが、個人的にはバッファの解放が必要ということで、ポインターですでにメモリ解放されていることを望みます。

原理的には、そこにあるすべてのものは、実装において非常に些細なことであるはずです)

理由: