【发布时间】:2015-05-25 04:34:36
【问题描述】:
所以我有一点 SegFaults 并且想知道是否有人可以更深入地解释我这是如何工作的。
我有一个围绕数字变量的包装类,我正在尝试构建表达式的计算树。这是一个示例代码:
class DoubleWrap{
public:
static int id;
DoubleWrap(double value){this->value = value;myid=++id;}
double value;
int myid;
std::vector<DoubleWrap*> parents;
DoubleWrap operator+(DoubleWrap& x){
DoubleWrap result(this->value + x.value);
setParents(*this,result);
setParents(x,result);
return result;
}
void setParents(DoubleWrap& parent,DoubleWrap& child){
child.parents.push_back(&parent);
}
void printTree(){
std::cout<< "[" << this->myid << "]-(";
for (auto& elem: this->parents)
std::cout<< elem->myid << "," << elem <<",";
std::cout<<")"<<std::endl;
for (auto& elem: this->parents)
elem->printTree();
}
}
我遇到的问题是像 x = a+b+c+d; 这样的表达式。当我尝试寻找 x 的父母时,它有 2 个父母,但 parents[0].parents[0] 是 nil,例如由于某种原因,指向分配位置的指针不起作用或分配的内存被破坏?
如果有人可以就解决方法以及为什么会发生这种情况向我提供建议,我非常感兴趣。
举一个关于这段代码的例子:
DoubleWrap dw(12.6);
DoubleWrap dw2(12.5);
DoubleWrap dw3(12.4);
DoubleWrap dw4(12.3);
DoubleWrap a = dw + dw2 + dw3;
DoubleWrap b = a + dw+ dw2+ dw3 + dw4;
b.printTree();
我期望输出:
[10]-(9,0x13a4b50,4,0x7fff5bdb62f0,)
[9]-(8,0x13a4b00,3,0x7fff5bdb62c0,)
[8]-(7,0x13a49f0,2,0x7fff5bdb6290,)
[7]-(6,0x7fff5bdb6320,1,0x7fff5bdb6260,)
[6]-(5,0x13a4db0,3,0x7fff5bdb62c0,)
[5]-(1,0x7fff5bdb6260,2,0x7fff5bdb6290,)
[1]-()
[2]-()
[3]-()
[1]-()
[2]-()
[3]-()
[4]-()
但我得到的结果(通常在不同的运行中不同):
[10]-(9,0x7ffffd5e2f00,4,0x7ffffd5e2de0,)
[9]-(33,0x1c6da10,3,0x7ffffd5e2db0,)
Process finished with exit code 139
我的猜测是运算符的返回实际上复制了 DoubleWrap 变量,因此父母中的指针指向的值超出范围并释放内存?
临时的解决方案是通过引用返回,但问题是为什么以及是否有合适的?
PS:修正了我之前遇到的一个错误,它是 setParents 中的一个错误。
【问题讨论】:
-
只是不相关,但你用“一点 SegFaults”让我开心:))
-
operator+修改参数很奇怪。 -
你是如何编译的?
-
@NeilKirk 好点子,应该(可能)通过
const参考,以确保operator+=表现良好(即,应该做与POD 一样的事情,例如int) -
该代码无法编译,您的向量需要指向对象的指针,而您正在将对象推回其中。
标签: c++ pointers memory memory-management operator-overloading