当我以这种方式编写关于下一个代码的代码时,它将返回奇怪的错误。
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;
}
为什么会这样?这两种初始化下一个节点的方式有何不同?
答案 0 :(得分:4)
您正在设置节点以指向本地堆栈变量,当您转到for循环的下一次迭代时,该变量会被破坏。
您使用new Student
通过进行堆分配来修复此问题
答案 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);
您正在堆中分配对象。
离开示波器后,您将访问不再属于您的内存,并且可以被其他功能覆盖。