自定义迭代器实现导致内存泄漏

Posted

技术标签:

【中文标题】自定义迭代器实现导致内存泄漏【英文标题】:custom iterator implementation causing memory leaks 【发布时间】:2015-11-05 20:38:43 【问题描述】:

我已经为一个自定义库实现了一个 random_access_iterator(它被模板化为可作为 const 迭代器和非常量迭代器重用),但它在执行类似 std::sort(container.begin(), container.end()container.begin()/end() return @987654323 @实例。

我的实现有什么问题?

template <bool is_const_iterator = false>
class meta_iterator : public std::iterator<std::random_access_iterator_tag, T> 
public:
  typedef T value_type;
  typedef std::ptrdiff_t difference_type;
  typedef typename std::conditional<is_const_iterator, const value_type &,
                                    value_type &> reference;
  typedef std::random_access_iterator_tag iterator_category;
  typedef typename std::conditional<is_const_iterator, value_type const *,
                                    value_type *>::type pointer;
  typedef meta_iterator self_type;

  meta_iterator(T *ptr) : ptr_(ptr) 

  meta_iterator(const meta_iterator<true> &other) : ptr_(other.ptr_) 

  self_type operator+(difference_type value) 
    ptr_ += value;
    return *(this);
  ;

  self_type operator-(difference_type value) 
    ptr_ -= value;
    return *(this);
  ;

  difference_type operator-(const self_type &other) 
    return ptr_ - other.ptr_;
  

  T &operator[](difference_type value) const  return *ptr_[value]; 
  bool operator==(const self_type &other) const  return ptr_ == other.ptr_; 
  bool operator!=(const self_type &other) const  return !(*this == other); 
  bool operator>=(const self_type &other) const  return !((*this) < other); 
  bool operator<=(const self_type &other) const  return !((*this) > other); 
  bool operator<(const self_type &other) const  return ptr_ < other.ptr_; 
  bool operator>(const self_type &other) const  return ptr_ < other.ptr_; 
  self_type &operator=(const self_type &other) 
    ptr_ = other.ptr_;
    return *(this);
  
  T *operator->() const  return ptr_; 
  T &operator*() const  return *ptr_; 

  self_type &operator--() 
    ptr_--;
    return *this;
  

  self_type operator--(int) 
    self_type temp(*this);
    --(*this);
    return (temp);
  

  self_type &operator++() 
    ptr_++;
    return *this;
  

  self_type operator++(int) 
    self_type temp(*this);
    --(*this);
    return (temp);
  

  self_type &operator+=(difference_type value) 
    ptr_ += value;
    return *(this);
  

  self_type &operator-=(difference_type value) 
    ptr_ -= value;
    return *(this);
  

  friend class meta_iterator<true>;
  friend class meta_iterator<false>;

private:
  T *ptr_;
;

【问题讨论】:

你确定,内存泄漏是由这个迭代器引起的吗?如何判断内存泄漏? 您认为问题所在的原因是什么?可能 1) 容器泄漏 2) 容器中使用的类型执行不正确(任何规则..) @cdonat 很好,应该是。 std::sort 根本不依赖于容器(假设 begin()end() 实现正确),所以我假设 AddressSanitizer 指向迭代器泄漏。 【参考方案1】:

不知道会不会导致内存泄漏,但是这两个操作符

  self_type operator+(difference_type value) 
    ptr_ += value;
    return *(this);
  ;

  self_type operator-(difference_type value) 
    ptr_ -= value;
    return *(this);
  ;

应该只返回一个新的迭代器,而不是更新存储的ptr_

还有一个错别字

  self_type operator++(int) 
    self_type temp(*this);
    --(*this);
    return (temp);
  

让它走向错误的方向。这可能会混淆一些循环。

【讨论】:

以上是关于自定义迭代器实现导致内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

View的post方法导致的内存泄漏分析

使用@tf.function 进行自定义张量流训练的内存泄漏

线程造成的内存泄漏

LeakCanary 内存泄漏 监测 性能优化 简介 原理

DialogFragment 泄漏内存

Android 内存泄漏的一些情况。