为什么函数返回空对象?

时间:2018-02-04 22:13:15

标签: c++ algorithm sorting c++11 move-semantics

这是c ++ 11。使用两个堆栈的堆栈的直接排序功能。 虽然在sort()函数中调试tempStack正确填充但sort()函数返回空对象?

我试图添加std :: move()或std :: forward(),但这是不正确的。一般sort()算法是正确的!此代码已成功编译。 c ++ 11的一些错误(移动语义)!

我的想法(不正常!): 返回>(tempStack); return move(tempStack);

代码(sort()):

template<typename T>
Stack<T> sort(Stack<T> &input)
{
    if(input.isEmpty()) return Stack<T>();
    Stack<T> tempStack;
    while(!input.isEmpty())
    {
        T element = input.pop();
        while(!tempStack.isEmpty() && tempStack.peek() > element) input.push(tempStack.pop());
        tempStack.push(move(element));
    }
    return tempStack;
}

代码(堆栈类):

template <typename T>
class Stack
{
public:
    Stack() : top(nullptr), stackSize(0)
    {}
    Stack(Stack &&other) : top(std::move(other.top)), stackSize(std::move(other.stackSize)) {}
    ~Stack() { while (!isEmpty()) pop(); }
    void push(T &&value)
    {
        auto n = new Node(std::forward<T>(value), top);
        top = n;
        ++stackSize;
    }
    T &peek()
    {
        if (!top) throw StackIsEmptyException();
        return top->value;
    }
    T pop()
    {
        if (!top) throw StackIsEmptyException();
        auto value(std::move(top->value));
        auto n = top;
        top = n->next;
        delete n;
        --stackSize;
        return value;
    }
    bool isEmpty() const { return !top; }
    size_t size() const { return stackSize; }
    class StackIsEmptyException
    {};
private:
    struct Node
    {
        Node(T &&v, Node *n): value(std::move(v)), next(n)
        {}
        Node(const T &v, Node *n): value(v), next(n)
        {}
        T value;
        Node *next;
    };
    Node *top;
    size_t stackSize;
};

代码(main()):

Stack<int> s;
s.push(34);;
s.push(3);
s.push(31);
s.push(98);
s.push(92);
s.push(23);

cout << sort(s).peek() << endl;

2 个答案:

答案 0 :(得分:3)

这条线路运行时会发生什么?

while (scnr.hasNextLine()) {
    String text = scnr.nextLine();
    System.out.println(text);

    String data[] = text.split(",", -1);
    System.out.println(Arrays.toString(data));
    Students.add(new Student(data[0], data[1], data[2], data[3]));
}
  1. return tempStack; 被移动到临时对象。
  2. tempStack被销毁。
  3. 返回临时对象。
  4. 在第1步中,tempStack的{​​{1}}和top被复制到临时对象(即移动构造函数的作用)。 在步骤2中,释放堆栈中的所有项目。 在第3步中,此返回对象的stackSize现在指向已释放的内存。

    你的移动构造函数应该将移动的对象的tempStack设置为NULL(并且可能还top为0),以便该对象在&##时不会解除分配任何内容39; s被毁坏了。

答案 1 :(得分:0)

重要的是通知移动的对象它不应该销毁其资源。例如,如果物体被移动,您可以使用防护装置来防止清洁叠层。

像:

Stack(Stack &&other) : top(std::move(other.top)), stackSize(std::move(other.stackSize)) { other.moved = true; }

~Stack() { if (!moved) while (!isEmpty()) pop(); }