Effective C++ 条款16~17
2021-08-01 01:56
标签:异常 c++ 必须 一个 有用 effect 内存泄漏 std call Effective C++ 条款16:成对使用new和delete时要采取相同形式 我们先看下面两行代码 std::string* stringArray = new std::string[100]; delete stringArray; 这里我们先new了一个string数组,然后又把这个数组删除了。但是delete没有用[],发生了内存泄露。 这个内存泄露可能跟我们理解上有点偏差。首先我们new是100个string对象,如果单纯的用delete,这100个对象所占用的地址确实是被释放掉了。 但是string里面可是进行了动态内存分配的。换句话说,每个string里面都是有一个指针。如果想安全的释放每个string对象所占用的内存,就必须调用string的析构函数。 不过遗憾的是,我们这里是直接给delete。它会直接释放这100个string对象,并不会调用每个对象的析构函数。 如果用delete[]就不同了,它会告诉编译器,你将要释放的是个数组。请一个一个的delete他们。那当我们单独delete一个string的时候,当然会调用它的析构函数。这样才能避免内存泄漏。 Effective C++ 条款17:以独立的语句将new出的对象置入智能指针 考虑下面这段代码 // preliminary int priority(); class Widget{}; // call function ‘doSomething‘ doSomething(shared_ptr(new Widget), priority()) 在执行调用语句的时候,编译器需要考虑这三个步骤 new Widget 调用priority方法 将new出来的Widget临时对象放入智能指针 调用doSomething doSomething一定在最后执行。但是调用priority方法和将new出来的指针放入shared_ptr这两个,也就是(2)和(3)的步骤是不确定的。 如果在调用priority方法时出错了,程序崩溃或者抛出异常了。那么new Widget得到的指针就会成为野指针。那段内存就泄露了。 所以,以独立的语句将newed对象存储于智能指针内。Effective C++ 条款16~17标签:异常 c++ 必须 一个 有用 effect 内存泄漏 std call 原文地址:https://www.cnblogs.com/destinyzk/p/14960723.html