new Sales_item;
new Sales_item;
new Sales_item;
new Sales_item;//这些必须主动delete//计算析构函数的调用次数,在析构函数中定义了一个打印语句以供判断
#include"head.h"
#include"Sales_item.h"
void fcn(const Sales_item *trans, Sales_item accum){//函数内是三次,item1和item2,还有一个accum的副本
Sales_item item1(*trans), item2(accum);
if(!item1.same_isbn(item2)) return;
if(item1.avg_price() <= 99){
std::cout << "test(in):" << std::endl;
return;
}
else if (item2.avg_price() <= 99) return;
}
int main(){
Sales_item item1,item2;
Sales_item *p = &item1;
//p = new Sales_item;//对照组:p指向正常的动态分配对象,delete没问题
fcn(&item1, item2);
std::cout << "test1:" << std::endl;
delete p;//先调用一次delete p, 再在结束默认删item1,重复?其实是这里是一个强制用delete删除一个non-dynamic-obj的错误吧
//不等到最后冲突,在此句执行完就弹错了(因为是内存错误把,当即生效),那些报错声明还是看不太懂,一大堆地址,还有rw-p之类的权限,每个地址的权限?
std::cout << "test2:" << std::endl;
new Sales_item;
new Sales_item;
new Sales_item;
new Sales_item;//要注意析构函数的调用条件,这些必须主动delete
}
小结:析构不能overload,但是编译器始终都能合成一个析构函数并且始终都会运行。这也证实出了overload功能确实只是compiler的一个小功能,overload参数列表不同只是对coder的要求,compiler本身是可以随意去构建重载的。
rule of three:析构函数需要另外两个复制控制,尽管不能通过打印输出之类的验证他们一起运行过(Class a = new Class;也是一样,虽然此复制构造过程用到赋值操作符,但是显示不出来,只显示用过一次copy-constructor)
存疑:13.4 13.9 13.12牵连的Noame类,有个私有成员,是std::string *pstring;关于此指针的初始化,复制,析构等问题
到底什么是所谓的复制指针指向的string对象而非复制指针,是指复制指针内容么(也就是两指针同指向一个对象)?这不叫复制指针?如果是真正意义的复制string对象,那么string对象存在哪?类对象成员中只有一个string指针,没有string对象的位置。