Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我将指向对象的指针设置为NULL时,为什么会出现分段错误?_C++_Pointers_Linked List_Segmentation Fault_Queue - Fatal编程技术网

C++ 当我将指向对象的指针设置为NULL时,为什么会出现分段错误?

C++ 当我将指向对象的指针设置为NULL时,为什么会出现分段错误?,c++,pointers,linked-list,segmentation-fault,queue,C++,Pointers,Linked List,Segmentation Fault,Queue,好的,我有一个程序,基本上是运行一个市场模拟。我的很多程序都运行得很好,我只有一个问题。在我的程序中的某一点上,我有一个这样的跳棋结构: 14 struct Checker 15 { 16 int m_money_in_register; 17 int m_start_work; 18 int m_time_checkout; 19 Cust *m_cust; 20 }; 我创建一个指向棋盘格对象数组的指针,如下所示: 118 Checker *checkers = ne

好的,我有一个程序,基本上是运行一个市场模拟。我的很多程序都运行得很好,我只有一个问题。在我的程序中的某一点上,我有一个这样的跳棋结构:

 14 struct Checker
 15 {
 16  int m_money_in_register;
 17  int m_start_work;
 18  int m_time_checkout;
 19  Cust *m_cust;
 20 };
我创建一个指向棋盘格对象数组的指针,如下所示:

118 Checker *checkers = new Checker[num_checkers]; // Initializing all checkers
119  for(int i = 0; i < num_checkers; i++)
120  {
121   checkers[i].m_money_in_register = 500;
122   checkers[i].m_start_work = 0;
123   checkers[i].m_cust = NULL;
124   checkers[i].m_time_checkout = 0;
125  }
195 if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
215      }
1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
Segmentation fault
175    for(int i = 0; checker_queue.empty() != true && i < num_checkers; i++)
176    {
177      int checker_number = i;
178      if(checkers[i].m_cust == NULL && checkers[i].m_start_work == 0)
179      {
180       checkers[i].m_cust = checker_queue.dequeue();
181       checkers[i].m_cust->print_start_checkout(cout, clock, checker_number);
182
183      if(checkers[i].m_cust->get_status() == "shopper")
184       {
185        checkers[i].m_time_checkout = clock + (checkers[i].m_cust->get_num_items()*3);
186       }
187
188       else if(checkers[i].m_cust->get_status() == "robber")
189       {
190        checkers[i].m_time_checkout = clock + 7;
191       }
192       cout << "time checkout: " << checkers[i].m_time_checkout << endl; //check for checkout time
193      }
194
195      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() ==    "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL;
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL;
215      }
216     }
1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
14: James paid $10 for 2 items to checker 1
Segmentation fault
如何将对象正确设置为NULL?im获取的输出示例如下所示:

118 Checker *checkers = new Checker[num_checkers]; // Initializing all checkers
119  for(int i = 0; i < num_checkers; i++)
120  {
121   checkers[i].m_money_in_register = 500;
122   checkers[i].m_start_work = 0;
123   checkers[i].m_cust = NULL;
124   checkers[i].m_time_checkout = 0;
125  }
195 if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
215      }
1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
Segmentation fault
175    for(int i = 0; checker_queue.empty() != true && i < num_checkers; i++)
176    {
177      int checker_number = i;
178      if(checkers[i].m_cust == NULL && checkers[i].m_start_work == 0)
179      {
180       checkers[i].m_cust = checker_queue.dequeue();
181       checkers[i].m_cust->print_start_checkout(cout, clock, checker_number);
182
183      if(checkers[i].m_cust->get_status() == "shopper")
184       {
185        checkers[i].m_time_checkout = clock + (checkers[i].m_cust->get_num_items()*3);
186       }
187
188       else if(checkers[i].m_cust->get_status() == "robber")
189       {
190        checkers[i].m_time_checkout = clock + 7;
191       }
192       cout << "time checkout: " << checkers[i].m_time_checkout << endl; //check for checkout time
193      }
194
195      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() ==    "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL;
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL;
215      }
216     }
1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
14: James paid $10 for 2 items to checker 1
Segmentation fault
正如我所说,第13行是我想要的,但是将Cust对象的指针设置为null会导致seg错误。如果需要更多的澄清,或者您想要GDB消息,我可以提供。欢迎您的任何意见,谢谢


整个循环如下所示:

118 Checker *checkers = new Checker[num_checkers]; // Initializing all checkers
119  for(int i = 0; i < num_checkers; i++)
120  {
121   checkers[i].m_money_in_register = 500;
122   checkers[i].m_start_work = 0;
123   checkers[i].m_cust = NULL;
124   checkers[i].m_time_checkout = 0;
125  }
195 if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL; // SEG FAULT CAUSED BY THIS
215      }
1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
Segmentation fault
175    for(int i = 0; checker_queue.empty() != true && i < num_checkers; i++)
176    {
177      int checker_number = i;
178      if(checkers[i].m_cust == NULL && checkers[i].m_start_work == 0)
179      {
180       checkers[i].m_cust = checker_queue.dequeue();
181       checkers[i].m_cust->print_start_checkout(cout, clock, checker_number);
182
183      if(checkers[i].m_cust->get_status() == "shopper")
184       {
185        checkers[i].m_time_checkout = clock + (checkers[i].m_cust->get_num_items()*3);
186       }
187
188       else if(checkers[i].m_cust->get_status() == "robber")
189       {
190        checkers[i].m_time_checkout = clock + 7;
191       }
192       cout << "time checkout: " << checkers[i].m_time_checkout << endl; //check for checkout time
193      }
194
195      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() ==    "shopper" && checkers[i].m_cust != NULL)
196      {
197       int amount_paid = checkers[i].m_cust->get_num_items()*5;
198       checkers[i].m_money_in_register += amount_paid;
199       checkers[i].m_cust->print_done_checkout(cout, clock, amount_paid, i);
200       Cust *tmp = checkers[i].m_cust;
201       delete tmp;
202       num_custs--;
203       checkers[i].m_cust = NULL;
204      }
205
206      if(checkers[i].m_time_checkout == clock && checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL)
207      {
208       int checker_cash = checkers[i].m_money_in_register;
209       checkers[i].m_cust->print_done_stole(cout, clock, checker_cash, i);
210       checkers[i].m_money_in_register = 0;
211       Cust *tmp = checkers[i].m_cust;
212       delete tmp;
213       num_custs--;
214       checkers[i].m_cust = NULL;
215      }
216     }
1: Joe entered store
Should be done at: 7
2: James entered store
Should be done at: 8
3: Bob entered store
Should be done at: 9
4: Abby entered store
Should be done at: 10
5: Leo entered store
Should be done at: 11
7: Joe done shopping
7: Joe started checkout with checker 0
time checkout: 13
8: James done shopping
8: James started checkout with checker 1
time checkout: 14
9: Bob done shopping
10: Abby done shopping
11: Leo done shopping
13: Joe paid $10 for 2 items to checker 0
14: James paid $10 for 2 items to checker 1
Segmentation fault

我怀疑问题在于您正在测试优化的代码,因此崩溃发生位置的表示是不正确的。问题可能是if语句中的以下代码:

checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL
你用错误的方法来解决这个问题;在尝试对其调用get_status()之前,需要检查m_cust是否为null

i、 e

当给定两个逻辑AND条件时:

如果(a&b)

b
仅当
a
为真时才需要检查。C和C++在达到一个不需要其余测试的条件时停止评估条件(称为“短路评估”)。p> 如果(a | |(b&c))

如果
a
为真,则不计算b和c<仅当
a
为假且
b
为真时,才会计算code>c

--旁白--

我猜这是你“这里发生了什么”调查的一部分,但你应该做得很好

delete checkers[i].m_cust;
只要对象检查器[i].m_cust单独分配了“new”。确保你没有这样做

Customers* customer = new Customer[someNumber];
...
checkers[i].m_cust = customer[x];
...
delete checkers[i].m_cust;  // << BAD

当您处理完它们时。

我怀疑问题在于您正在测试优化的代码,因此崩溃发生位置的表示不正确。问题可能是if语句中的以下代码:

checkers[i].m_cust->get_status() == "robber" && checkers[i].m_cust != NULL
你用错误的方法来解决这个问题;在尝试对其调用get_status()之前,需要检查m_cust是否为null

i、 e

当给定两个逻辑AND条件时:

如果(a&b)

b
仅当
a
为真时才需要检查。C和C++在达到一个不需要其余测试的条件时停止评估条件(称为“短路评估”)。p> 如果(a | |(b&c))

如果
a
为真,则不计算b和c<仅当
a
为假且
b
为真时,才会计算code>c

--旁白--

我猜这是你“这里发生了什么”调查的一部分,但你应该做得很好

delete checkers[i].m_cust;
只要对象检查器[i].m_cust单独分配了“new”。确保你没有这样做

Customers* customer = new Customer[someNumber];
...
checkers[i].m_cust = customer[x];
...
delete checkers[i].m_cust;  // << BAD

当你处理完它们时。

这段代码看起来是正确的,尽管很可怕(在删除它之前你不需要测试
checkers[i].m_cust
)。也许你可以把它简化为一个循环。问题似乎是索引i超出了可接受的范围。请显示分配客户的代码。此外,您是在GDB(g++-O0-ggdb-Wall…)下运行非优化代码,还是在运行优化代码?如果对其进行优化,则崩溃的行信息可能不准确。@VladfromMoscow:否,因为索引i使用在崩溃上方的两行。如果它超出了界限,我会期望segfault更高。这段代码看起来是正确的,尽管很可怕(在删除它之前,您不需要测试
checkers[I].m_cust
)。也许你可以把它简化为一个循环。问题似乎是索引i超出了可接受的范围。请显示分配客户的代码。此外,您是在GDB(g++-O0-ggdb-Wall…)下运行非优化代码,还是在运行优化代码?如果对其进行优化,则崩溃的行信息可能不准确。@VladfromMoscow:否,因为索引i使用在崩溃上方的两行。如果它是出界,我会期待赛格断层进一步上升。谢谢你,这帮助了很多!摆脱了分割错误,现在我必须修复更多的东西。再次感谢!正如Adam指出的,这叫做“短路评估”——我在答案中添加了一些解释。如果您正在使用gdb进行调试,请查看gdb的
-tui
文本ui选项:)哈哈,是的,我虽然完全理解短路评估,但在逻辑和推理方面很容易出错。我的程序几乎完成了我想要它做的,希望我能让它工作。我刚开始学习gdb,这太棒了!谢谢你的小道消息谢谢,这帮了大忙!摆脱了分割错误,现在我必须修复更多的东西。再次感谢!正如Adam指出的,这叫做“短路评估”——我在答案中添加了一些解释。如果您正在使用gdb进行调试,请查看gdb的
-tui
文本ui选项:)哈哈,是的,我虽然完全理解短路评估,但在逻辑和推理方面很容易出错。我的程序几乎完成了我想要它做的,希望我能让它工作。我刚开始学习gdb,这太棒了!谢谢你的小道消息