首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:如何对scoped_ptr进行单元测试?

C++:如何对scoped_ptr进行单元测试?
EN

Stack Overflow用户
提问于 2019-04-14 22:01:15
回答 1查看 93关注 0票数 1

假设我已经实现了一个scoped_ptr

代码语言:javascript
复制
template <typename T> class scoped_ptr {
 public:
  scoped_ptr() = delete;
  explicit scoped_ptr(T *ptr) : _ptr(ptr){};
  ~scoped_ptr() {
    delete _ptr;
    _ptr = nullptr;
  };

  scoped_ptr(const scoped_ptr &p) = delete;
  scoped_ptr &operator=(const scoped_ptr &p) = delete;

  T *operator->() const { return _ptr; }
  T &operator*() const { return *_ptr; }
  T *get() const { return _ptr; }
  void reset(T *p = nullptr) {
    delete _ptr;
    _ptr = p;
  }

 private:
  T *_ptr;
};

我想测试在指针的生命周期结束后内存是否被释放,但是我不能通过取消引用原始指针_ptr来验证这一点,因为它所指向的内存应该已经被释放了。那我该怎么测试它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-15 14:31:41

使用一个带有对象计数的类怎么样?附注:您需要在reset中检查自赋值。

演示:https://ideone.com/hnxc9o

代码语言:javascript
复制
#include <cassert>
#include <iostream>

using namespace std;

template <typename T>
class scoped_ptr {
 public:
  scoped_ptr() = delete;
  explicit scoped_ptr(T *ptr) : _ptr(ptr) {}
  virtual ~scoped_ptr() { reset(); }

  scoped_ptr(const scoped_ptr &p) = delete;
  scoped_ptr &operator=(const scoped_ptr &p) = delete;

  T* operator->() const { return _ptr; }
  T& operator*() const { return *_ptr; }
  T* get() const { return _ptr; }
  void reset(T* p = nullptr) {
    if (_ptr == p) {
      return;
    }
    delete _ptr;
    _ptr = p;
  }

 private:
  T* _ptr;
};

struct ObjectCounter {
  static int _object_count;
  ObjectCounter() {
    ++_object_count;
  }
  virtual ~ObjectCounter() {
    --_object_count;
  }
};

int ObjectCounter::_object_count = 0;

int main() {
  {
    scoped_ptr<ObjectCounter> ptr(new ObjectCounter());
    assert(ObjectCounter::_object_count == 1);
  }
  assert(ObjectCounter::_object_count == 0);
  return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55676120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档