1,构造和析构,是c++必然会执行的,这里要注意。
结果:
这个例子,单纯看执行情况和语法没错误,但是有的问题的是bye 应该调用3次,但是只调用了2次。
正确的做法是:改基类的析构函数为虚函数,
下面这句话 uObj在析构的时候才会正确调用RealObject的析构函数(如果不是虚的析构函数,只会调用Object本身的析构函数)
题外话,对于下面的shared_ptr,如果基类不是虚的析构函数,也会调用RealObject的析构函数,这点上和unique_ptr有所不同,但是,为了保险起见,建议还是基类的析构函数还是虚函数。
更改为:
执行结果:
2,内存方面
1)下图,正常情况没问题。但是有瑕疵,没做检查。
2)下图有问题,因为new的是数组,所以应该delete掉数组
更改为:
3)错误,remakeRoom里面资源泄露了,应该传引用
4)nameInfo返回的时候,就被析构了,所以在testInfo函数里面得到的返回值实际上没有,运行起来会出现任何未定义情况
3,vector相关的常用操作
前言:remove()函数
#include <iostream> // std::cout
#include <algorithm> // std::remove
int main() {
int myints[] = { 10,20,30,30,20,10,10,20 }; // 10 20 30 30 20 10 10 20
// bounds of range:
int* pbegin = myints; // ^
int* pend = myints + sizeof(myints) / sizeof(int); // ^ ^
pend = std::remove(pbegin, pend, 20); // 10 30 30 10 10 ? ? ?
// ^ ^
std::cout << "range contains:";
for (int* p = pbegin; p != pend; ++p)
std::cout << ' ' << *p;
std::cout <<'\n'<< "以上是第一次执行remove函数"<<'\n';
std::cout<<'\n' << "以下是执行remove函数之后,数组里面的变化" << '\n';
for (int* t = myints; t != (myints + sizeof(myints) / sizeof(int)); ++t)
std::cout << ' ' << *t;
std::cout << '\n';
std::cin.get();
return 0;
}
执行结果:
解释:
pend = std::remove(pbegin, pend, 20); //remove函数会返回一个指针
//参数pbegin数组指针头,参数pend数组指针尾部+1,参数20是要移动的值
//数组里的20并不会删除掉,而是将20的值排到了数组的最后面,而且数值会乱
//返回值pend是排序后的数组,除了20以外的其他值的,最后一个指针+1的指针
//下面打印数组的元素也会发现,20元素并没有删除,而是排到了最后面
//猜想:为什么没有删除,而是排到了最后面,而且数值还乱码了,岂不是没用的数组了吗
//猜测的原因,因为stl里面的容器有自己的删除元素的方法,所以标准算法,不做删除,只做删除的准备工作,降低实现难度。
正题开始:
解释:
vector实现删除特定值的元素方法分两步:
第一步,执行remove函数,将删除的元素排到最后面
第二步,执行vector的erase()函数来实现删除指针区域的元素
4,<< >>:一般情况不要用
5,迭代器的使用
解释:
1)迭代器,用前置++(返回值自身的引用),后置++(返回临时变量)
2),迭代器比较不要用<,因为有的迭代器没有重载<,所以用!=
3),每次计算c.end()会耗费性能,这样写会好些
4)因为数组没有迭代器,所以不通用,那么改成如下,
5)前面都是自己实现,标准库有提供,如下
6,异常处理