这篇文章主要讲解了“关于c++的坑有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“关于c++的坑有哪些”吧!
<强> 1。字符串的字符串拼接,导致coredump 强>
该问题的核心点在于第9行,竟然是可以编译通过,其原因是x +“产生绯闻,会被转成char *,然后与to_string叠加导致错误。
<强> 2。地图的迭代器删除强>
地图要删除一个元素,通常通过擦除()函数来完成,但是要注意,如果我们传入了一个迭代器作为消除的参数来删除当前迭代器所指向的元素,删除完成后迭代器会失效,产生未定义行为。
正确的使用方法应该是接收抹去()的返回值,让迭代器指向被删除元素的下一个元素或者()结束。
for , (, auto iter =, m.begin ();, iter !=, m.end ();, iter + +), {,,, if , (…),,,, iter =, m.erase (iter);,,,,}
但是上述代码仍然有错误,因为如果触发了删除,那么iter再下一轮循环时会指向下下个元素,所以正确的写法应该是:
for , (, auto iter =, m.begin ();, iter !=, m.end ();), {,,, if , (…), {,,, iter =, m.erase (iter);,,,, continue ,,,,,},, else , {,,, iter + +,,,,,},,,,}
<强> 3。stringstream的性能问题强>
- <李>
鸿蒙官方战略合作共建——HarmonyOS技术社区
李> <李>, stringstream的清空是明确之后,置空。
李> <李>, stringstream在任何情况下都比snprintf慢。
李> <李>, memset是个很慢的函数,宁愿新创建对象。
李> <李>,上述测试结果是单线程,改成多线程,同样成立。
李> <李>, str +=癮”,比str=str +“a”效率高很多,后者会创建新对象。
李><强> 4。智能指针(要)使用注意强>
<强> 4.1尽量使用make_shared初始化强>
提高性能
std:: shared_ptr, spw (newWidget);
需要分配两次内存。每个std::要查看都指向一个控制块,控制块包含被指向对象的引用计数以及其他东西。这个控制块的内存是在std::要查看的构造函数中分配的。因此直接使用新的,需要一块内存分配给部件,还要一块内存分配给控制块
autospw =, std:: make_shared();
一次分配就足够了。这是因为std:: make_shared申请一个单独的内存块来同时存放部件对象和控制块。这个优化减少了程序的静态大小,因为代码只包含一次内存分配的调用,并且这会加快代码的执行速度,因为内存只分配了一次。另外,使用std:: make_shared消除了一些控制块需要记录的信息,这样潜在地减少了程序的总内存占用。
<强>异常安全强>
processWidget (std:: shared_ptr(, new 小部件),,,,//潜在的资源泄露,,,,,computePriority ());
上述代码存在内存泄漏的风险,上述代码执行分为3个步骤:
1只;new 小部件
2。要查看构造
3。computePriority
编译器不需要必须产生这样顺序的代码,但“新小部件”必须在std::要查看的构造函数被调用前执行。如果编译器产生的顺序代码如下:
1只;new 小部件
2。执行computePriority .
3。执行std::shared_ptr的构造函数。
如果执行步骤2:computePriority的时候程序出现异常,则在第一步动态分配的Widget就会泄露了,因为它永远不会被存放到在第三步才开始管理它的shared_ptr中
4.2 父类之类智能指针转换
C++中是允许裸指针,因此裸指针之间转换方法同C语言指针强转,智能指针转换不能通过上述方法进行强转,必须通过库提供转换函数进行转换。C++11的方法是:std::dynamic_pointer_cast;boost中的方法是:boost::dynamic_pointer_cast
#include#include #include #include class Base { public : Base(){} virtual ~Base() {} }; class D : public Base { public : D(){} virtual ~D() {} }; int main() {
//方式一:先初始化子类智能指针,然后调用dynamic_pointer_cast转换成基类智能指针对象关于c++的坑有哪些