注意:这不是家庭作业,而是来自我们的教授给我们的实践考试,以帮助我们为我们的考试做好准备
我正在攻读编程考试.在他们给我们的一个样本测试中,我们有以下问题:
假设您已经获得了一个模板化容器,该容器包含无序的对象集合.
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),如果取消引用,它将导致未定义的行为.
| 归档时间: |
|
| 查看次数: |
1661 次 |
| 最近记录: |