错误、漏洞、问题 - 页 1875

 

可能是因为你在OnStart()函数 中手动调用它。

静态对象的析构器在此函数之后按声明的相反顺序调用。

 
Koldun Zloy:

可能是因为你在OnStart()函数 中手动调用它。

静态对象的析构器在此函数之后按声明的相反顺序调用。

看来,这里的一切都应该正常工作
template <typename T>
struct PTR
{
  T* Ptr;
  
  PTR( void )
  {
  }
  
  void operator =( T* &Value )
  {
    this.Ptr = Value;
  }
  
  ~PTR( void )
  {
    Print(__FUNCSIG__);
    delete this.Ptr;
  }
};

class CLASS
{
private:
  static PTR<CLASS> Ptr;
  static CLASS* Tmp;
  
  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }
};

static PTR<CLASS> CLASS::Ptr;
static CLASS* CLASS::Tmp = new CLASS;

void OnStart()
{
}

但是泄漏确实发生了。问题出在哪里?

 
fxsaber:
我认为这里的一切都必须正常工作

但是泄漏正在发生。问题出在哪里?


你创建了两个对象,只删除了一个。

为什么你需要CLASS::Tmp 对象

 
Koldun Zloy:


你创建了两个对象,只删除了一个。

在什么时候,两个对象被创造出来?

为什么你需要一个CLASS::Tmp 对象

多亏了你,没有必要。但为了理解语言,我还是想了解为什么这个例子会导致泄漏。

不过,带有隐藏构造函数的隐藏对象在某些情况下是符合逻辑的(可能是最普遍的一种)。

 

是的,我错了。你只有一个对象被创建而没有被删除。

因为当你调用构造函数时

  CLASS()
  {
    CLASS::Ptr = CLASS::Tmp;
  }

CLASS::Tmp仍然包含垃圾,而不是对象的地址。

 
1) 创建静态PTR<CLASS> CLASS::Ptr结构。
2) 类被创建,新的CLASS;它执行构造函数CLASS(),CLASS::Ptr被分配为Null
3) CLASS::Tmp值由指向新CLASS的指针更新。
4) 删除PTR<CLASS>结构CLASS::Ptr;执行析构器,试图删除CLASS::Ptr(它是Null)。
 
Koldun Zloy:

CLASS::Tmp仍然包含垃圾,而不是一个对象地址。

谢谢你!不知为何,我没有注意到这个明显的问题。

谢尔盖-迪尤布利 克。
1) 一个静态PTR<CLASS> CLASS::Ptr结构被创建。
2) 创建一个类,new CLASS;运行构造函数CLASS(),CLASS::Ptr被分配为Null
3) CLASS::Tmp值由指向新CLASS的指针更新。
4) 删除PTR<CLASS>结构CLASS::Ptr;执行析构器,试图删除CLASS::Ptr(它是Null)。

谢谢你。但它不是Null,是垃圾。

 

如果模式是这样就好了

ChartSetInteger( 0,CHART_SHOW,false );

模式将不显示交易 的箭头(进场/出场)。那里根本不需要他们。

 
我是一个新手,想订一份工作,现在我的余额为0,我可以开一个主题吗?还是我必须在开始时给我的账户充值? 当他们从我的账户中冻结资金时,我有点困惑。
 
The service is unavailable.
去买一些缬草酊剂......(
原因: