Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/17/10 07:41:28 (13 years ago)
Author:
swagner
Message:

Fixed memory leak when using parameters whose values are not deeply cloned (#1268)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Parameters/3.3/OptionalValueParameter.cs

    r4722 r4825  
    7878    }
    7979
     80    [Storable(DefaultValue = true)]
     81    private bool reactOnValueToStringChangedAndValueItemImageChanged;
     82    /// <summary>
     83    ///   True if this parameter should react on the ToStringChanged and ItemImageChanged events of its value, otherwise false.
     84    /// </summary>
     85    /// <remarks>
     86    ///   In some rare cases when the value of the parameter is not deeply cloned, this property has to be set to false
     87    ///   to avoid a memory leak (cf. ticket #1268). In all other cases this property should always be true.
     88    /// </remarks>
     89    public bool ReactOnValueToStringChangedAndValueItemImageChanged {
     90      get { return reactOnValueToStringChangedAndValueItemImageChanged; }
     91      set {
     92        if (value != reactOnValueToStringChangedAndValueItemImageChanged) {
     93          reactOnValueToStringChangedAndValueItemImageChanged = value;
     94          if (reactOnValueToStringChangedAndValueItemImageChanged)
     95            RegisterValueEvents();
     96          else
     97            DeregisterValueEvents();
     98        }
     99      }
     100    }
     101
    80102    #region Constructors
    81103    [StorableConstructor]
     
    85107      value = cloner.Clone(original.value);
    86108      getsCollected = original.getsCollected;
     109      reactOnValueToStringChangedAndValueItemImageChanged = original.reactOnValueToStringChangedAndValueItemImageChanged;
    87110      RegisterValueEvents();
    88111    }
     
    90113      : base("Anonymous", typeof(T)) {
    91114      this.getsCollected = true;
     115      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    92116    }
    93117    public OptionalValueParameter(string name)
    94118      : base(name, typeof(T)) {
    95119      this.getsCollected = true;
     120      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    96121    }
    97122    public OptionalValueParameter(string name, bool getsCollected)
    98123      : base(name, typeof(T)) {
    99124      this.getsCollected = getsCollected;
     125      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    100126    }
    101127    public OptionalValueParameter(string name, T value)
     
    103129      this.value = value;
    104130      this.getsCollected = true;
     131      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    105132      RegisterValueEvents();
    106133    }
     
    109136      this.value = value;
    110137      this.getsCollected = getsCollected;
     138      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    111139      RegisterValueEvents();
    112140    }
     
    114142      : base(name, description, typeof(T)) {
    115143      this.getsCollected = true;
     144      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    116145    }
    117146    public OptionalValueParameter(string name, string description, bool getsCollected)
    118147      : base(name, description, typeof(T)) {
    119148      this.getsCollected = getsCollected;
     149      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    120150    }
    121151    public OptionalValueParameter(string name, string description, T value)
     
    123153      this.value = value;
    124154      this.getsCollected = true;
     155      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    125156      RegisterValueEvents();
    126157    }
     
    129160      this.value = value;
    130161      this.getsCollected = getsCollected;
     162      this.reactOnValueToStringChangedAndValueItemImageChanged = true;
    131163      RegisterValueEvents();
    132164    }
     
    143175
    144176    public override string ToString() {
    145       return Name + ": " + (Value != null ? Value.ToString() : "null");
     177      if (reactOnValueToStringChangedAndValueItemImageChanged)
     178        return Name + ": " + (Value != null ? Value.ToString() : "null");
     179      else
     180        return Name;
    146181    }
    147182
     
    167202
    168203    private void RegisterValueEvents() {
    169       if (value != null) {
     204      if ((value != null) && reactOnValueToStringChangedAndValueItemImageChanged) {
    170205        value.ItemImageChanged += new EventHandler(Value_ItemImageChanged);
    171206        value.ToStringChanged += new EventHandler(Value_ToStringChanged);
Note: See TracChangeset for help on using the changeset viewer.