重载运算符=中的分段错误

我只是在为类FeatureRandomCounts重载赋值运算符时出现了seg错误,该类有一个_rects作为其指针成员,指向FeatureCount的数组并且大小为rhs._dim,其他日期成员是非指针:

FeatureRandomCounts &  FeatureRandomCounts::operator=(const FeatureRandomCounts &rhs)  
{  
  if (_rects) delete [] _rects;  

  *this = rhs;  // segment fault

  _rects = new FeatureCount [rhs._dim];  
  for (int i = 0; i < rhs._dim; i++)  
  {  
    _rects[i]=rhs._rects[i];  
  }  

  return *this;    
}

有人有一些线索吗? 感谢致敬!


如前所述,你有无限递归; 然而,要补充一点,下面是一个实现op =的简单方法:

struct T {
  T(T const& other);
  T& operator=(T copy) {
    swap(*this, copy);
    return *this;
  }
  friend void swap(T& a, T& b);
};

写一个正确的副本和交换,并为您处理异常安全和所有边缘案例!

复制参数按值传递,然后更改。 当拷贝被销毁时,当前实例必须销毁的任何资源都会被处理。 这遵循当前的建议并干净地处理自我分配。


#include <algorithm>
#include <iostream>

struct ConcreteExample {
  int* p;
  std::string s;

  ConcreteExample(int n, char const* s) : p(new int(n)), s(s) {}
  ConcreteExample(ConcreteExample const& other)
  : p(new int(*other.p)), s(other.s) {}
  ~ConcreteExample() { delete p; }

  ConcreteExample& operator=(ConcreteExample copy) {
    swap(*this, copy);
    return *this;
  }

  friend void swap(ConcreteExample& a, ConcreteExample& b) {
    using std::swap;
    //using boost::swap; // if available
    swap(a.p, b.p); // uses ADL (when p has a different type), the whole reason
    swap(a.s, b.s); // this 'method' is not really a member (so it can be used
                    // the same way)
  }
};

int main() {
  ConcreteExample a (3, "a"), b (5, "b");
  std::cout << a.s << *a.p << ' ' << b.s << *b.p << 'n';
  a = b;
  std::cout << a.s << *a.p << ' ' << b.s << *b.p << 'n';
  return 0;
}

注意它可以与手动管理的成员(p)或RAII / SBRM样式的成员一起使用。


*this = rhs;

调用operator =(),这是您正在编写的函数。 提示无限递归,堆栈溢出,崩溃。

另外,如果你使用std :: vector而不是C风格的数组,你可能根本不需要实现operator =()。


 *this = rhs;  // segment fault

这绝对不是这样做的方式。 你叫=递归调用没有内置的赋值运算符。 逐个分配变量。 不要懒惰。

链接地址: http://www.djcxy.com/p/72897.html

上一篇: segmentation fault in overloading operator =

下一篇: Existing Standard Style and Coding standard documents