MQL5におけるOOPに関する質問 - ページ 4 1234567891011...96 新しいコメント Vladimir Simakov 2019.07.04 11:06 #31 Dmitry Fedoseev: また、ポインタは非参照で渡すこともできます(&なし)。 はい、できます。しかし、&なしでポインタを渡すと、スタック上に新しいポインタが生成され、そこに渡された値が代入される。また、関数内でこのポインタでメモリを確保すると、スタック上に生成されるポインタが変化するため、スタックを展開する際にメモリリークが発生する。もちろん、それはよくないことなのですが、もし、そうしたいと思ったら......。 Igor Makanu 2019.07.04 11:14 #32 Vladimir Simakov: このようにデストラクタが呼ばれると、スタック上に作られたポインタが変更され、その結果、スタックを「巻き戻す」ときにメモリリークが発生します。もちろん、そんなことをするのはよくないのですが、もし、そうしたいと思ったら......。 MQLのクラスへのポインタの挙動は予測できません。ある管理者は、すべてのクラスはグローバルメモリに作成される(メモリ割り当て)と書いていましたが、あなたはローカルスコープのクラスへのポインタはスタックに作成されると書いています(イミフ、そうあるべきです!)。 テストクラスのデストラクタにPrint() を登録しておけば、ローカルスコープを出るときに自動的にデストラクタが呼ばれるはずなので、理論的には難しいことではないのですが...。 Dmitry Fedoseev 2019.07.04 11:23 #33 Vladimir Simakov: はい、できます。ポインタを&なしで渡した場合のみ、スタック上に新しいポインタが生成され、そこに渡された値が代入されます。そして、関数内でこのポインタでメモリを確保すると、スタック上に生成されたポインタが変化するため、スタックを展開する際にメモリリークが発生する。もちろん、それはよくないことなのですが、もし、そうしたいと思ったら......。 漏れることはないでしょう。なぜなら、誰もこのポインタに関数の中で何かを割り当てていないからです。 Vladimir Simakov 2019.07.04 11:36 #34 Igor Makanu: MQLのクラスへのポインタの挙動は予測できません。ある管理者は、すべてのクラスはグローバルメモリに作成される(メモリ割り当て)と書いていましたが、あなたはローカルスコープのクラスへのポインタはスタックに作成されると書いています(イミフ、そうあるべきです!)。 テストクラスのデストラクタにPrint()を登録し、ローカルスコープを出るときにデストラクタが自動的に呼ばれるようにすればいいだけなので、理論的には難しくないのですが...。 メモリを動的に確保(new)した場合はヒープに、スタック上にオブジェクトを作成(CObj obj;)した場合はスタック上にもメモリが確保されます。 Vladimir Simakov 2019.07.04 11:41 #35 Dmitry Fedoseev: 漏れることはないでしょう。なぜなら、誰もこのポインタに関数の中で何も割り当てていないからです。 void CreateLabel(CChartObjectLabel *l,string name,int y) { l=new CChartObjectLabel; l.Create(0,name,ChartWindowFind(),0,y); l.Color(clrYellow); l.FontSize(14); l.Description(name); } これは典型的なリークです。スタック上に作成され、関数に渡された値で作成時に初期化されたポインタは、新しい値が割り当てられ、新しいオブジェクトへのポインタとなりました。その後、スタックを展開する際にポインタを安全に殺すことができました。それこそが、私たちが証明しなければならないことなのです。これはまさに、あるべき姿です。 void CreateLabel(CChartObjectLabel* &l,string name,int y) Dmitry Fedoseev 2019.07.04 11:42 #36 Vladimir Simakov: メモリを動的に確保(new)した場合はヒープに、スタック上にオブジェクトを作成(CObj obj;)した場合はスタック上のそのオブジェクトにもメモリを確保する。 mqlには、そのようなものはありません - (CObj obj;). Dmitry Fedoseev 2019.07.04 11:43 #37 Vladimir Simakov: 定番のリーク。スタック上に作成され、作成時に関数に渡された値で初期化されたポインタに、新しい値が割り当てられ、新しいオブジェクトへのポインタとなりました。その後、スタックを展開する際にポインタを安全に殺すことができました。それこそが、私たちが証明しなければならないことなのです。これはまさに、あるべき姿です。 神の贈り物と卵を混同しないでください。誤っていることを証明するために、バカなコードを書くのはもっといいことだ......。 Vladimir Simakov 2019.07.04 12:04 #38 Dmitry Fedoseev: mqlにそのようなものはない - (CObj obj;) いつも使っているんだ。 Artyom Trishkin 2019.07.04 12:16 #39 Vladimir Simakov: void CreateLabel(CChartObjectLabel *l,string name,int y) { l=new CChartObjectLabel; l.Create(0,name,ChartWindowFind(),0,y); l.Color(clrYellow); l.FontSize(14); l.Description(name); } 定番のリーク。スタック上に作成され、作成時に関数に渡された値で初期化されたポインタに、新しい値が割り当てられ、新しいオブジェクトへのポインタとなりました。その後、スタックを展開する際にポインタを安全に殺すことができました。それこそが、私たちが証明しなければならないことなのです。これはまさに、あるべき姿です。 なぜ、関数に渡された ポインタを 意図的に再代入 するのですか?もちろん、リークもあるでしょう。しかし、これは「古典的なリーク」ではなく、オブジェクトへのポインタを扱う際の古典的なエラーである。 ここでは新しいオブジェクトを作成する必要はなく、関数に渡されたポインタの外部オブジェクトを処理します。 Dmitry Fedoseev 2019.07.04 12:42 #40 Vladimir Simakov: いつも使っているんだ。 どこで、どのように? 1234567891011...96 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
また、ポインタは非参照で渡すこともできます(&なし)。
このようにデストラクタが呼ばれると、スタック上に作られたポインタが変更され、その結果、スタックを「巻き戻す」ときにメモリリークが発生します。もちろん、そんなことをするのはよくないのですが、もし、そうしたいと思ったら......。
MQLのクラスへのポインタの挙動は予測できません。ある管理者は、すべてのクラスはグローバルメモリに作成される(メモリ割り当て)と書いていましたが、あなたはローカルスコープのクラスへのポインタはスタックに作成されると書いています(イミフ、そうあるべきです!)。
テストクラスのデストラクタにPrint() を登録しておけば、ローカルスコープを出るときに自動的にデストラクタが呼ばれるはずなので、理論的には難しいことではないのですが...。
はい、できます。ポインタを&なしで渡した場合のみ、スタック上に新しいポインタが生成され、そこに渡された値が代入されます。そして、関数内でこのポインタでメモリを確保すると、スタック上に生成されたポインタが変化するため、スタックを展開する際にメモリリークが発生する。もちろん、それはよくないことなのですが、もし、そうしたいと思ったら......。
漏れることはないでしょう。なぜなら、誰もこのポインタに関数の中で何かを割り当てていないからです。
MQLのクラスへのポインタの挙動は予測できません。ある管理者は、すべてのクラスはグローバルメモリに作成される(メモリ割り当て)と書いていましたが、あなたはローカルスコープのクラスへのポインタはスタックに作成されると書いています(イミフ、そうあるべきです!)。
テストクラスのデストラクタにPrint()を登録し、ローカルスコープを出るときにデストラクタが自動的に呼ばれるようにすればいいだけなので、理論的には難しくないのですが...。
メモリを動的に確保(new)した場合はヒープに、スタック上にオブジェクトを作成(CObj obj;)した場合はスタック上にもメモリが確保されます。
漏れることはないでしょう。なぜなら、誰もこのポインタに関数の中で何も割り当てていないからです。
これは典型的なリークです。スタック上に作成され、関数に渡された値で作成時に初期化されたポインタは、新しい値が割り当てられ、新しいオブジェクトへのポインタとなりました。その後、スタックを展開する際にポインタを安全に殺すことができました。それこそが、私たちが証明しなければならないことなのです。これはまさに、あるべき姿です。
メモリを動的に確保(new)した場合はヒープに、スタック上にオブジェクトを作成(CObj obj;)した場合はスタック上のそのオブジェクトにもメモリを確保する。
mqlには、そのようなものはありません - (CObj obj;).
定番のリーク。スタック上に作成され、作成時に関数に渡された値で初期化されたポインタに、新しい値が割り当てられ、新しいオブジェクトへのポインタとなりました。その後、スタックを展開する際にポインタを安全に殺すことができました。それこそが、私たちが証明しなければならないことなのです。これはまさに、あるべき姿です。
神の贈り物と卵を混同しないでください。誤っていることを証明するために、バカなコードを書くのはもっといいことだ......。
mqlにそのようなものはない - (CObj obj;)
定番のリーク。スタック上に作成され、作成時に関数に渡された値で初期化されたポインタに、新しい値が割り当てられ、新しいオブジェクトへのポインタとなりました。その後、スタックを展開する際にポインタを安全に殺すことができました。それこそが、私たちが証明しなければならないことなのです。これはまさに、あるべき姿です。
なぜ、関数に渡された ポインタを 意図的に再代入 するのですか?もちろん、リークもあるでしょう。しかし、これは「古典的なリーク」ではなく、オブジェクトへのポインタを扱う際の古典的なエラーである。
ここでは新しいオブジェクトを作成する必要はなく、関数に渡されたポインタの外部オブジェクトを処理します。
いつも使っているんだ。
どこで、どのように?