首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“重置”gsl::owner<T>?

如何“重置”gsl::owner<T>?
EN

Stack Overflow用户
提问于 2020-02-27 19:10:11
回答 1查看 872关注 0票数 0

当我创建一个对象并将其追加到列表中时

代码语言:javascript
复制
auto o = new object;
m_objects.push_back(o);

我从编译器那里得到了几个提示,提示我应该按照C++核心检查准则清理代码,其中包括

  • 不直接使用newdelete,使用unique_ptr (VC++ warning C26409)
  • 重置或显式delete a owner<T>指针(VC++警告26403)H 210F 211

后者引起了我的兴趣:既然我已经将所有权转移到了list,那么我应该如何“重置”这个指针,这样编译器就不会在这里警告我?分配nullptr会给我一个额外的警告

  • 没有分配给可能处于有效状态的owner<T> (VC++警告26405)

也不能澄清最初的投诉,所以不是这样。

EN

回答 1

Stack Overflow用户

发布于 2021-08-11 19:58:46

警告C26403:重置或显式删除所有者指针'p‘(r.3)。

在本例中可以看到两个部分(“重置”和“显式删除”):

代码语言:javascript
复制
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被显式删除。

只是重置而不放弃所有权,就像

代码语言:javascript
复制
gsl::owner<char*> p = new char{};
p = nullptr;

当然是内存泄漏,因此可以证明

警告C26405:不要向可能处于有效状态的所有者分配(r.3).

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60440210

复制
相关文章

相似问题

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