c – 如果std :: vector元素’自杀’会发生什么(使用delete this;)?

c – 如果std :: vector元素’自杀’会发生什么(使用delete this;)?,第1张

概述假设有一个项目向量 vector<Item*> items; //{item1, item2, item3} 然后,在代码的其他部分, items[1]->suicide(); 自杀职能是: void Item::suicide(){ delete this;} 什么是项目矢量大小以及它现在的排列方式? 可以这样做吗? 编辑(我可以问一个额外的问题吗?):如果输出的所需排列是{item1 假设有一个项目向量

vector<Item*> items; //{item1,item2,item3}

然后,在代码的其他部分,

items[1]->suicIDe();

自杀职能是:

voID Item::suicIDe(){   delete this;}

什么是项目矢量大小以及它现在的排列方式?
可以这样做吗?

编辑(我可以问一个额外的问题吗?):如果输出的所需排列是{item1,item3},大小是2,没有悬空指针,如何以自毁方式(从item2本身)进行 *** 作?

编辑2:谢谢你的所有答案!真棒.所以我最终决定并找到了从对象外部做到这一点的方法,因为这是一种不好的做法而且不必要地复杂化

解决方法 什么是项目矢量大小以及它现在的排列方式?相同.函数调用根本不会改变矢量内容或大小.它只是释放指针指向的内存.

这样做可以吗?更准确地说:这是合法的C吗?是.这是好的风格编程吗?不,请允许我详细说明后者:

>应该分开关注点:谁负责内存管理?类Item或类Item本身的容器或用户?
>通常,容器或用户应该这样做,因为他知道发生了什么.
>这样做的方法是什么?现代安全C代码中的内存管理主要使用std :: shared_ptr和std :: unique_ptr等智能指针以及std :: vector和std :: map等容器完成.
>如果类Item是值类型(这意味着您可以简单地复制它并且它在虚函数方面没有多态行为),那么只需使用std :: vector< Item>而是你的代码.一旦从容器中删除元素,就会自动调用析构函数.容器为你做.
>如果类Item具有多态行为并且可以用作基类,则使用std :: vector< std :: unique_ptr< Item>>或std :: vector< std :: shrared_ptr< Item>>相反,更喜欢std :: unique_ptr解决方案,因为它增加了更少的开销.只要您停止引用某个对象,它就会被您正在使用的智能指针的析构函数自动删除.你(几乎)不再需要担心内存泄漏了.
>产生内存泄漏的唯一方法是,您拥有包含std :: shared_ptrs的对象,这些对象以循环方式相互引用.使用std :: unique_ptrs可以防止这种麻烦.另一种出路是std :: weak_ptrs.

底线:不提供自杀功能().而是将责任完全交给调用代码.使用标准库容器和智能指针来管理内存.

编辑:关于编辑中的问题.写吧

items.erase( items.begin() + 1 );

这适用于所有类型:std ::值的向量或指针.您可以找到std :: vector和C标准库here的良好文档.

总结

以上是内存溢出为你收集整理的c – 如果std :: vector元素’自杀’会发生什么(使用delete this;)?全部内容,希望文章能够帮你解决c – 如果std :: vector元素’自杀’会发生什么(使用delete this;)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1221075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存