如何解决可能的动态分配问题
现在,我正在尝试使我的代码(简单的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 举报,一经查实,本站将立刻删除。