我正在尝试制作一个小的自定义矢量...
元素类,应指向下一个类的地址,但使用此代码
class foo {
private:
int attr;
public:
foo(){attr = 10;}
int get_attr(){return attr;}
void set_attr(int a){attr =a;}
};
class element_foo {
private:
foo data;
element_foo *ptr_next;
public:
element_foo(){ptr_next = NULL;}
element_foo(int dat){data.set_attr(dat); ptr_next = NULL;}
element_foo(int dat, element_foo next){
data.set_attr(dat);
ptr_next = &next;
}
foo get_data(){return data;}
element_foo get_next(){return *ptr_next;}
void print_array(){
if (ptr_next == NULL) {
std::cout<< data.get_attr()<<std::endl;
}
else {
std::cout<< data.get_attr()<<std::endl;
this->get_next().print_array();
}
}
};
int main (int argc, char * const argv[]) {
// insert code here...
element_foo a1(10);
element_foo a2(15,a1);
element_foo a3(20,a2);
a3.print_array();
std::cout << "Hello, World!\n";
return 0;
}
当我打印a3时,会出现分段错误...为什么?我的错在哪里?
答案 0 :(得分:4)
错误在于此构造函数:
element_foo(int dat, element_foo next){
data.set_attr(dat);
ptr_next = &next;
}
您正在获取当地人的地址。 ptr_next = &next;
函数结束后,地址无效。
您需要做的是将next
作为指针传递:
element_foo(int dat, element_foo *next){
data.set_attr(dat);
ptr_next = next;
}
将主要内容改为:
element_foo a1(10);
element_foo a2(15,&a1);
element_foo a3(20,&a2);
编辑:
或者,您可以通过引用传递它:
element_foo(int dat, element_foo &next){
data.set_attr(dat);
ptr_next = &next;
}
答案 1 :(得分:1)
问题是您正在存储指向临时对象的指针。
'next
'只是您传入a1
/ a2
的 副本 ,因为它是按值复制的。您应该使用引用复制,以便&next
完全引用a1
/ a2
的地址,而不是它们的副本。
v-------- should use "const element_foo &"
element_foo(int dat, element_foo next){
data.set_attr(dat);
ptr_next = &next;
}
// a2->ptr_next is dangling
element_foo a2(15,a1);
执行上述行时,a2->ptr_next
并未指向a1
,
但是一个已被破坏的临时本地物体。
因此a2->ptr_next
悬空。通过此指针进行的任何后续访问都有未定义的行为。