为什么下面代码的输出总是糟糕
。如何让 happy
作为输出?为什么 happy
分支无法访问?
public class HowToMakeStackoverflowBetter {
private static final int HUMAN_PATIENCE = 10;
private List<Member> members = new ArrayList<>();
private int atmosphere = -10;
private Random r = new Random();
public HowToMakeStackoverflowBetter(int size) {
for (int i = 0; i < size; i++) { members.add(new Member()); }
}
public Member pick() { return members.get(r.nextInt(members.size())); }
public class Member {
private int patience = HUMAN_PATIENCE;
private Question question = null;
public Member() { patience = r.nextInt(patience+1) + atmosphere; }
public void vote(Question q) {
if (patience >= 0) {
voteUp(q);
} else {
voteDown(q);
}
}
public void ask() {
question = new Question();
for (Member member : members) {
member.vote(question);
}
}
private void voteUp(Question q) { ++q.vote; }
private void voteDown(Question q) { --q.vote; }
public String toString() {
return (question.vote >= 0)? "Happy!" : "Suck!";
}
}
public class Question { private int vote; }
public static void main(String[] args) {
HowToMakeStackoverflowBetter stackoverflow = new HowToMakeStackoverflowBetter(100);
Member me = stackoverflow.pick();
me.ask();
System.out.println(me);
}
}
经过 1000 次循环后,它给了我们 1000 次糟糕的结果。我记得在两三年前,情况并非如此。有些东西变了。
最佳答案
两个问题。第一:
linkedList::linkedList(){
*sentinel.last=sentinel;
*sentinel.next=sentinel;
sentinel.str="I am sentinel!!";
};
sentinel
是你的成员变量,.last
是它指向另一个节点的指针。这尚未初始化,因此尝试使用它是未定义的行为。实际上,它有效地指向内存中(或内存外)的随机地址,并且您尝试取消引用该指针,然后将整个哨兵对象复制到想象中指向地址的节点上:即您尝试复制 3 个指针在sentinel
节点成员变量到内存中的随机地址。
你可能想这样做:
linkedList::linkedList()
{
sentinel.last = &sentinel;
sentinel.next = &sentinel;
sentinel.str = "I am sentinel!!";
}
其次,您显式调用 linkedList 的析构函数,当对象离开其创建所在的堆栈范围时执行编译器安排的销毁时,这会导致未定义的行为 - 即在 main()
的末尾.
我建议你改node.str
成为std::string
,就像在任何现实的程序中一样,您希望能够处理可变文本,而不仅仅是指向(常量)字符串文字。事实上,如果您混合使用字符串文字和自由存储分配的字符数组,您将不知道何时调用 delete[]
。释放内存。您可以通过始终制作要与 new[]
一起存储的字符串数据的新副本来解决此问题。 , 但它更安全、更易于使用 std::string
.
关于java - 为什么另一个分支在我的代码中无法访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20833878/