微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可能的动态分配问题

如何解决可能的动态分配问题

现在,我正在尝试使我的代码(简单的POD容器)尽可能稳定地运行。我主要关心的是内存分配和释放(new []和delete []运算符)。是否有可能摆脱其中的不良行为(例如SIGSEGV或异常)? 这是我写的一个小测试示例:

class my_vector{
    private:
        long* _data;
        size_t _size;
        size_t _capacity;
    public:
        my_vector()
       {
           this->_data = new long[10];
           this->_size = 0;
           this->_capacity = 10;
       };

        ~my_vector()
       {
           delete[] this->_data;
       };

        void add(long value)
       {
           if (this->_size == this->_capacity)
                 this->expand();
           this->_data[this->_size] = value;
           this->_size++;
       };
    private:
        void expand()
        {
           long* tmp = new long[this->_capacity*2];
           memcpy(tmp,this->_data,sizeof(long)*this->_size);
           this->_capacity *= 2;
           delete[] this->_data;
           this->_data = tmp;
        };
}

解决方法

默认情况下,new[]表达式在失败时会引发异常(例如,如果动态内存分配失败)。

如果正在构造的任何对象的构造函数因引发异常而失败,则new []表达式将具有引发该异常的(净)效果。在最终发出异常之前,还发生了一些其他事情-例如,如果在动态分配的数组中构造第三个对象失败,则将调用两个先前构造的对象的析构函数。就调用代码而言,如果发出异常,则new[]表达式创建的对象都不存在。这是在标准中指定的。

如果引发异常且从未捕获到异常,则程序将终止。那是正常的,是预期的。

除非被破坏的对象的析构函数抛出,否则delete []表达式通常不会抛出。定义抛出的析构函数通常被认为是非常差的做法,因此应避免使用。

nothrow表达式有一种new形式,它本身不会引发异常。在这种情况下,new表达式会在失败时给出空指针。

new[]delete []表达式本身不会引起SIGSEGV或任何其他形式的异常终止。如果发生这种情况,则表明某些 other 代码表现出未定义的行为(例如,写在数组末尾)。可以在数组中对象的构造函数或析构函数中,也可以在其他代码中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。