C++和X2B;动态数组实现

2021-02-03 12:44

1AS作为一个C++初学者,来自java,我对内存管理的主题和如何避免内存泄漏越来越困惑。下面的代码是否存在内存泄漏的风险,而我目前还没有意识到?任何帮助或建设

解答动态

  • delete看起来很奇怪。没有理由创建新的协议。一切都可以(而且应该)到位。顺便说一句,m\u capacity=m\u capacity*2;这是一个错误(我怀疑是insert的拷贝粘贴)。
    if在一个紧密循环中会导致严重的性能损失。考虑将插入循环分解为二:
    (int i=0,;ilt;m_length;i++){new_arr[index+1]=arr[index];} 这将我们带到下一点:没有循环。复制范围上的两个循环。把它们分解成功能:
    复制范围(new \u arr,arr,index);new \u arr[index]=obj;copy \u range(new \u arr+index+1,arr+index,m \u length-index); 习惯用法,copy

    • u range最好用迭代器的tem来表示,而不是用索引来表示。
      请考虑在删除太多之后收缩数组。

      • Const correctness 不修改基础对象的成员函数通常应该是Const成员函数。为了示例:
        Tget(int index);//O(1) 这不会修改DynamicArray的内容,并按值返回元素(不是引用),因此客户端代码也无法访问DynamicArray的内部数据来修改它。因此,这几乎肯定是一个常量成员功能:
        Tget(int index)const;避免不必要的复制 现在您的add、insert和set成员函数都按值接受T对象。
        void add(T obj);void insert(int index,T obj);void set(int index,T obj); 这意味着在DynamicArray中添加/插入/设置元素时,首先在客户机代码中创建对象的一个副本,然后复制该对象作为参数传递,然后执行副本赋值将其放入数组中。对于要复制的“便宜”类型(例如int),这是可以的,但是对于要复制的昂贵类型(例如,如果有人创建一个DynamicArraylt;intamp;obj);void insert(int index,T constamp;obj); 这避免了仅为传递参数而创建副本,因此最终只有两个对象实例:一个在客户端代码中,另一个在数组本身中,但是没有一个额外的参数作为参数传递。
        使用对const对象的引用允许引用引用临时对象。例如,假设我有一个表示复数的复杂类型。如果我有一个类似myComplex+yourComplex的表达式,它将创建一个临时对象。一个const对象的引用可以引用临时(但没有const限定符)。在C++中,0/3/5 的PultRead有一个一般规则,如果需要实现任何赋值、复制构造和销毁,则可能需要实现所有三个来获得一个正确管理其资源的类。析构函数,是的,你真的需要做一些事情来处理拷贝构造和拷贝分配。例如,如果创建Dyn的副本数组:
        DynamicArraygt;foo;DynamicArraygt;bar=foo; …结果往往是丑陋的一面(例如,通常是核心转储)。
        因此,您通常希望实现(至少)复制构造和复制分配,或者阻止试图编译的代码,通常使用本:
        卡雷(DynamicArray constamp;operator=(DynamicArray constamp;)=delete;DynamicArrayamp;)=delete; 所以三个规则包括销毁,c

        • End

        免责声明:

        本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。