"ダミー "からの質問 - ページ 106

 
uncleVic:
タスク...信号モジュールを添付してください(持っていません)。見てみよう。
ファイル:
 
openlive:

さらに不思議なことにその効果が発揮されていないのです。
 
uncleVic:

さらに奇妙なことに効果がわからない。

初期化時のみ効果を発揮し、テスターでは全て正常です

よし、いらない、本当にいらない。

 

Zigzagインジケータが、もはや存在しない値(再描画前にあったはずの値)を読み取ってしまいます。 これを回避することは可能でしょうか?

値がバッファにあるのなら、なぜ再描画されないのか...。

 

こんにちは、以下について説明してください。

class Cbase
{
public:
        virtual ~Cbase(){};
        int k;
};

class Cchild:public Cbase
{
public:
        ~Cchild(){};
        double *p;
        int f;
};

私は2つのクラスを持っていますが、私は次の世代のインスタンス(ベース- 子 - 子2 - ...)が、メモリにますます多くのスペースを取ると信じています。Newオペレータには、パラメータでクラスを渡しながら、どれだけのメモリを確保するかを正確に言う。しかし、delete演算 子では、どれだけのメモリを確保するかは、正確には言っていないのです。この理屈でいくと、次の場面ではどうなるのか、よくわからない。

void fn()
{
   Cbase *pClass;
   pClass = new Cchild;
   delete pClass;
   return;
}

つまり、Cbase(Cchildに比べれば小さなクラス)へのポインタとして*pClassを宣言したが、実際にはCchildを指しているということだ。そこで、delete()は どのような挙動をするのでしょうか?Cbaseのサイズと同じバイト数だけ解放さ れるのか(そうするとメモリが詰まる)、それとも削除が正しく行われるのか?

P.S.: そうだ、もう一つ質問なのですが、割り当てられたメモリ領域(new)に、この領域のサイズがわかるようなラベルはあるのでしょうか(charの末尾が0になっているようなものが格納されている)?言い換えれば、私が宣言したクラスのサイズについて何も知らないコード片は、正しくメモリを解放できるのでしょうか?

 

220Volt:

問題は、delete()が どのような挙動を示すかです。Cbaseサイズと同じバイト数を解放 するのか(そうするとメモリが詰まる)、それとも正しく削除されるのか?

もちろん、メモリも正しく解放されます。

P.S.: そうだ、もう一つ質問なのですが、割り当てられたメモリ領域(new)に、この領域のサイズがわかるようなラベルはありますか(charが末尾にゼロターミネーターを持つように格納されているように)?言い換えれば、私が宣言したクラスのサイズについて何も知らないコード断片は、正しくメモリを解放できるのでしょうか?

sizeof ?
 
sergeev:

もちろん、正しく削除されます。ブリックポイントをデストラクタに分散させることができます。

この質問は、そんなところからきているのです。だいたい説明通りにやってみたところ(デストラクタはvirtualではなかった)、ポインタクラス以下のデストラクタは呼び出されなかった。
 
sergeev:
sizeof ?
sizeofはコンパイル時に機能すると思いますが、例えば他のプロセスからメモリを解放 する場合の話です。これが可能であれば、削除機能も理解できると思うのですが。
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
Документация по MQL5: Основы языка / Операторы / Оператор уничтожения объекта delete
  • www.mql5.com
Основы языка / Операторы / Оператор уничтожения объекта delete - Документация по MQL5
 
MQL5ではデストラクタは常に仮想です。デストラクタにPrint(__FUNCSIG__);を入れてみると、すべて正しく削除されます。

class CFoo
  {
public:
   ~CFoo() { Print(__FUNCSIG__); }
  };

class CBar : public CFoo
  {
public:
   ~CBar() { Print(__FUNCSIG__); }
  };

void OnStart()
  {
   CFoo *f=new CBar();
   
   delete f;   
  }
 
問題は、newを介してクラス関数に設定した内容よりも、その「ネイティブ」メンバのクラスデータについてである。結局、何もない空間でもないのです。