当我创建一个对象并将其追加到列表中时
auto o = new object;
m_objects.push_back(o);我从编译器那里得到了几个提示,提示我应该按照C++核心检查准则清理代码,其中包括
new和delete,使用unique_ptr (VC++ warning C26409)delete a owner<T>指针(VC++警告26403)H 210F 211后者引起了我的兴趣:既然我已经将所有权转移到了list,那么我应该如何“重置”这个指针,这样编译器就不会在这里警告我?分配nullptr会给我一个额外的警告
owner<T> (VC++警告26405)也不能澄清最初的投诉,所以不是这样。
发布于 2021-08-11 19:58:46
警告C26403:重置或显式删除所有者指针'p‘(r.3)。
在本例中可以看到两个部分(“重置”和“显式删除”):
gsl::owner<char*> p = new char{}; // take ownership
gsl::owner<char*> q = p; // copy ownership -> problem
p = nullptr; // p is reset to release ownership
delete q; // second is owner, needs explicit delete将p复制到q,然后重置,以便只存在一个所有者。
q被显式删除。
只是重置而不放弃所有权,就像
gsl::owner<char*> p = new char{};
p = nullptr;当然是内存泄漏,因此可以证明
警告C26405:不要向可能处于有效状态的所有者分配(r.3).
https://stackoverflow.com/questions/60440210
复制相似问题