java - 为什么另一个分支在我的代码中无法访问?

标签 java algorithm design-patterns

为什么下面代码的输出总是糟糕。如何让 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/

相关文章:

c++ - 在 C++ 中安全地传递对抽象类的引用

java - MapDB 弃用函数

java - 我如何在本地构建Corda项目?

algorithm - 随机突变爬山法和模拟退火法——哪个最快?

algorithm - 快速排序与归并排序

arrays - 降低数组中最大重复元素的复杂性

c++ - 有特殊 child 的容器模式

.net - 最终阻止的目的是什么?

java - JAR - 线程 "main"java.lang.NoClassDefFoundError : org/mortbay/jetty/Handler 中出现异常

java - JRadioButton选择颜色