编写一个测试用例来检查C++中的内存泄漏

blc*_*llo 1 c++ memory-leaks

注意:这不是家庭作业,而是来自我们的教授给我们的实践考试,以帮助我们为我们的考试做好准备

我正在攻读编程考试.在他们给我们的一个样本测试中,我们有以下问题:

假设您已经获得了一个模板化容器,该容器包含无序的对象集合.

template <typename T>
class Container {
   public:
      void insert(T *op);
      // EFFECTS: inserts the object pointed to by op into
      // the container
      T *remove();
      // EFFECTS: removes an object from the Container, and
      // returns a pointer to it. Returns NULL if no
      // objects remain in the Container.
      // Note: the implementation can choose which
      // object to return if more than one exists.
      Container(); // ctor
      Container(const Container &l); // copy ctor
      Container &operator=(const Container &l); // assignment
      ~Container(); // dtor
   private:
      ...
};
Run Code Online (Sandbox Code Playgroud)

请注意,这只是界面; 为简洁起见,省略了实施细节.但是,您可以假设实现是基于节点的; 链接的节点集合保存对象.

您怀疑析构函数的实现不满足At-Most-Once不变量的守恒规则,而是泄漏内存.编写验收测试(类似于项目4中的测试)以检查此情况.您必须提供合适的包含类型和执行测试的main.

请注意,您不能依赖语言未定义的任何行为,您可能不会认为您可以使用Project 5中的altnew分配器,并且您可能无法覆盖删除操作符.提示:您可以使用全局变量.

我虽然喜欢:

#include <iostream>

using namespace std;

int *p = NULL;

void leak() {
    int *num = new int(5);
    p = num;
    delete num;
}

int main() {
    if ((*p = 6)) {
        cout << "Memory leak\n";
    } else {
        cout << "No Leak\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

这背后的基本思想是我虽然无法写入我没有分配的内存空间.在编译这个测试代码虽然它工作得很好所以显然你可以.关于如何编写这样的测试用例的任何想法?

小智 5

当你说:

void leak() {
    int *num = new int(5);
    p = num;
    delete num;
}
Run Code Online (Sandbox Code Playgroud)

没有内存泄漏.但是,有一个悬空指针(p),如果取消引用,它将导致未定义的行为.