1

我使用 C++ 中的数组为双端队列编写了一个程序。分配的要求之一是处理异常。

我们应该检查的异常之一是内存不足异常。

由于它是一个动态大小的队列,我有一个方法可以在数组满时将其大小加倍。像这样:

try{
    doubleArray();
} catch (bad_alloc& e) {
    throw bad_alloc();
}

在主文件中,这个throwsbad_alloc被捕获。

我不知道如何测试这是否有效。我正在使用带有 X 代码的 Mac,并且还使用 Mac 终端来编译和测试文件。有谁知道如何测试这个异常?即在这些平台中的任何一个中设置内存限制或其他东西?或者即使我做得对与否?

编辑(更多信息):

这是我的实现doubleArray

void Deque<T>:: doubleArray(){
int newSize = size_of_Deque * 2;
T *newElement = new T[newSize];

int temp = front;
int begin = (newSize/4);
front = begin;
int end = size_of_Deque + begin - 1;

while (begin<=end) {
    newElement[begin] = element[temp];
    begin++;
    temp = (temp + 1)% size_of_Deque;
}

element = newElement;
back = end;
size_of_Deque = newSize;
delete [] newElement;


}

因此,当分配新数组(原始数组大小的两倍)时,可能会出现内存不足的情况。这就是我这样做的原因:

try{
    doubleArray();
}catch (bad_alloc& e) {
    throw bad_alloc();
}

同样,我的主要问题是我不知道如何测试它是否有效。有没有办法在终端或 X 代码中设置内存限制?

4

2 回答 2

0

你可以

throw std::bad_alloc{};

无论你想在你的程序中的任何地方,例如,如果队列变大或随机。例如这样的:

void doubleArray () {
    if (queueIsLarge) {
        throw std::bad_alloc("Thrown for test purposes.");
    }
    // Do the double array logic
}

会像人为的内存限制一样由 决定queueIsLarge

于 2015-02-23T01:44:30.470 回答
0

创建一个测试程序

  1. 创建对象的实例
  2. doubleArray()将大小增加到某个数字的调用,例如 65kb(如何执行此操作取决于数据结构的 API)
  3. 检查是否std::bad_alloc被抛出

在受限内存环境中运行测试程序

  1. 创建用户
  2. 在终端中,执行ulimit -m 64. 这将当前用户可用的内存量限制为 64 kb。该数字取决于您在上面的步骤 2 中选择的内容。
  3. 以该用户身份运行程序
于 2015-02-23T01:58:23.073 回答