C ++指针节点

时间:2017-01-13 19:20:17

标签: c++

当我以这种方式编写关于下一个代码的代码时,它将返回奇怪的错误。

struct Student{
    int val;
    Student* next;
    Student(int a){
        val = a;
        next = NULL;
    }
};
int main(){
Student begin(0);
Student *head = &begin;
Student *pointer = head;
for(int i=0;i<3;i++){
    pointer->val = i;
    Student next(0);
    pointer->next = &next;
    pointer = pointer->next;
}

while(head != NULL){
    cout<< head-> val<<endl;
    head = head ->next;
}
}

在我以这种方式改变循环之后,它就可以了。

for(int i=0;i<3;i++){
    pointer->val = i;
    pointer->next = new Student(0);
    pointer = pointer->next;
}

为什么会这样?这两种初始化下一个节点的方式有何不同?

4 个答案:

答案 0 :(得分:4)

您正在设置节点以指向本地堆栈变量,当您转到for循环的下一次迭代时,该变量会被破坏。

您使用new Student通过进行堆分配来修复此问题

Stack Memory vs Heap Memory

处对堆内存和堆内存进行了很多讨论

答案 1 :(得分:3)

当你宣布这样的学生时

Student next(0);

它在堆栈上分配临时内存,该内存只应被视为在该块中可用。

使用new时,可以在堆上分配可以在任何地方使用的内存。注意内存泄漏并始终定义析构函数。

new Student(0);

答案 2 :(得分:3)

for(int i=0;i<3;i++){
   pointer->val = i;
   Student next(0);
   pointer->next = &next;
   pointer = pointer->next;
}

您正在自动存储上创建对象学生(通常作为堆栈实现)。然后,您将在链接列表中存储指向此对象的指针。当学生&#39;超出范围删除对象。现在你的指针是一个悬空指针。取消引用该指针现在是未定义的行为。

  

pointer->next = new Student(0);

在动态存储上创建(通常作为堆实现)。这个对象将一直存在,直到你告诉它死掉(删除它)。

我建议您阅读C ++中堆栈/堆之间的差异。如果你想学习C ++,这是一个非常重要的主题。

另外,请确保删除任何新增对象!如果你不这样做,你的程序中最终会出现内存泄漏。

答案 3 :(得分:1)

通过

    public function filter(Request $request){

    $brand = $request->brand;
    $color = $request->color;
    $style = $request->style;
    $material = $request->material;
    $year = $request->year;
    $shape = $request->shape;

  $images = DB::table('images')->select('brand', 'color', 'style', 'material', 'shape', 'year', 'id', 'path', 'created_at')->where('year',$year)->paginate(12);

    if ($brand == 'leer') {
        $images->where('brand', '=', $brand);
    }

    if ($color == 'leer') {
        $images->where('color', '=', $color);
    }

    if ($style == 'leer') {
        $images->where('style', '=', $style);
    }

    if ($material == 'leer') {
        $images->where('material', '=', $material);
    }

    if ($shape == 'leer') {
        $images->where('shape', '=', $shape);
    }

    if ($year == 'leer') {
        $images->where('year', '=', $year);
    }




    return view('index')->with(compact('images'));

您正在堆栈中分配对象。

使用

Student next(0);

您正在堆中分配对象。

离开示波器后,您将访问不再属于您的内存,并且可以被其他功能覆盖。