【发布时间】:2020-09-20 00:13:50
【问题描述】:
现在我正试图让我的代码(简单的 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;
};
}
【问题讨论】:
-
如果您检查分配是否成功,并且不删除不属于您的数据,您应该没有问题。当您在这里分配时:
this->_data = new long[10];您不会检查分配是否成功。而且,如果你从这个类中复制任何对象,你会遇到一些严重的问题。我建议您: 1. 检查分配是否成功,以及 2. 关注The rule of three/five/zero。如果你两者都做,你应该没有任何问题。看看智能指针,这可能会有所帮助 -
@Pablochaches -
this->_data = new long [10]如果失败会抛出异常。这不需要检查(尽管异常最终需要被捕获,否则程序将终止)。
标签: c++ exception memory-management segmentation-fault new-operator