重载运算符=中的分段错误
我只是在为类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
这绝对不是这样做的方式。 你叫=
递归调用没有内置的赋值运算符。 逐个分配变量。 不要懒惰。