JianGuanTHU / UOJ_Offline

Offline test system for THUOOP
7 stars 0 forks source link

Proposal (第5次作业 智能指针) #10

Closed Ksitta closed 3 years ago

Ksitta commented 3 years ago

题目描述

很多同学会在申请内存之后忘了释放,为了解决这个问题,C++ 11中实现了一些智能指针类

auto_ptr, shared_ptr, unique_ptr

可以通过#include \来使用

详细解析可以见 https://blog.csdn.net/zy19940906/article/details/50470087

这次作业希望同学们自己实现一个简单的智能指针,要求能够实现自动析构一段没有被指向的内存

部分代码

main.cpp

#include <iostream>
#include "shareptr.h"
#include "Node.h"

using namespace std;

void test(){
    SharePtr<Node> a(new Node(2));
    {
        SharePtr<Node> b = a;
        SharePtr<Node> c(new Node(3));
        cout << *b << endl;
        b = c;
        cout << *c << endl;
    }
    if(Node::num_createfunc + Node::num_createfunc_default + Node::num_copyfunc + Node::num_movefunc != Node:: num_delfunc + 1){
        cout << "No" << endl;
    }
    cout << *a << endl;

}

int main(){
    test();
    Node::outputResult();
    return 0;
}

shareptr.h

#pragma once

template <typename T>
class SharePtr{
private:
    int *_n;
    T *_ptr;
public:
    SharePtr(const SharePtr & t) {
        // Todo
    }

    SharePtr(T * t) : _ptr(t){
        // Todo
    }

    SharePtr<T>&operator=(const SharePtr& t){
        // Todo
    }

    T& operator*() {
        // Todo
    }

    T*operator->(){
        // Todo
    }

    ~SharePtr(){
        // Todo
    }
};

以下两段代码来自第三次作业 Vector类的简易实现与封装 改变而成

node.h

#pragma once
#include <iostream>

void test();

class Node{
private:
    static long long int num_createfunc_default, num_createfunc, num_copyfunc, num_movefunc, num_copyassign, num_moveassign, num_delfunc;
    int val;
public: 
    Node(int v);
    Node();
    ~Node();
    Node(const Node &y);
    Node(Node &&y);
    Node& operator=(const Node &y);
    Node& operator=(Node &&y);
    bool operator!=(const Node &y);
    friend std::istream& operator>>(std::istream& in, Node& x);
    friend std::ostream& operator<<(std::ostream& out, const Node& x);
    static void outputResult();
    friend void test();
};

node.cpp

#include "Node.h"

long long int Node::num_createfunc = 0, Node::num_copyfunc = 0, Node::num_movefunc = 0;
long long int Node::num_copyassign = 0, Node::num_moveassign = 0, Node::num_delfunc = 0;
long long int Node::num_createfunc_default = 0;

Node::Node(int v): val(v) {
    num_createfunc++;
}
Node::Node(){
    num_createfunc_default++;
}
Node::~Node() {
    num_delfunc++;
}
Node::Node(const Node &y): val(y.val) {
    num_copyfunc++;
}
Node::Node(Node &&y): val(y.val) {
    y.val = 0;
    num_movefunc++;
}
Node& Node::operator=(const Node &y) {
    val = y.val;
    num_copyassign++;
    return *this;
}
Node& Node::operator=(Node &&y) {
    val = y.val;
    y.val = 0;
    num_moveassign++;
    return *this;
}

bool Node::operator!=(const Node & y){
    return val != y.val;
}

void Node::outputResult() {
    std::cout << Node::num_createfunc_default << " " << Node::num_createfunc << " " << Node::num_copyfunc << " " << Node::num_movefunc << " " << Node::num_copyassign << " " << Node::num_moveassign << " " << Node::num_delfunc << std::endl;
    if (Node::num_createfunc + Node::num_createfunc_default + Node::num_copyfunc + Node::num_movefunc == Node:: num_delfunc){
        std::cout << "YES" << std::endl;
    }   
    else{
        std::cout << "NO" << std::endl;
    }
}

std::istream& operator>>(std::istream& in, Node& x){
    in >> x.val;
    return in;
}
std::ostream& operator<<(std::ostream& out, const Node& x){
    out << x.val;
    return out;
}

考察知识点

模板类、智能指针

hzhwcmhf commented 3 years ago

我们课上会讲智能指针而且有部分的实现代码,我觉得可以考虑稍微改变一下功能