免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3044 | 回复: 4
打印 上一主题 下一主题

[C++] C++对象的构造与析构[已解决] [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-11 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-09 21:07 |只看该作者 |倒序浏览
本帖最后由 linuxchyu 于 2014-01-10 09:18 编辑

下面是测试对象的构造、复制构造和析构功能的代码。
testobj.h:
  1. #ifndef __TESTOBJ_H

  2. #define __TESTOBJ_H

  3. #include <iostream>
  4. class TestObj{
  5. private:
  6.         int *p;
  7. public:
  8.         TestObj(){
  9.                 p = new int(1);
  10.                 std::cout << "init p" << std::endl;
  11.         };
  12.         TestObj(const TestObj & obj){
  13.                 p = new int(1);
  14.                 std::cout << "copy p" << std::endl;
  15.         };
  16.         ~TestObj(){
  17.                 if (p != NULL){
  18.                         delete p;
  19.                         p = NULL;
  20.                         std::cout << "delete p , p="<< p<< std::endl;
  21.                 }
  22.         };
  23. };
  24. #endif
复制代码
test.cc:
  1. #include <iostream>
  2. #include <vector>
  3. #include <windows.h>
  4. #include "testobj.h"

  5. using namespace std;

  6. int main(){
  7.         vector<TestObj> objvector;
  8.         TestObj obj1;
  9.         objvector.push_back(obj1);
  10.         Sleep(1000);
  11.         cout << "------------" << endl;
  12.         TestObj obj2;
  13.         objvector.push_back(obj2);
  14.         Sleep(1000);
  15.         cout << "------------" << endl;
  16.         TestObj obj3;
  17.         objvector.push_back(obj3);
  18.         Sleep(1000);
  19.         cout << "------------" << endl;
  20. }
复制代码
运行输出结果是:
init p
copy p
------------
init p
copy p
delete p , p=00000000
copy p
------------
init p
copy p
copy p
delete p , p=00000000
delete p , p=00000000
copy p
------------
delete p , p=00000000
delete p , p=00000000
delete p , p=00000000
delete p , p=00000000
delete p , p=00000000
delete p , p=00000000
现在的问题是,为什么会多出了三个复制构造?按道理来说应该是3次普通的对象创建,和三次对象的复制构造啊,为什么会多出了3次对象的复制构造?求高手解答!

论坛徽章:
0
2 [报告]
发表于 2014-01-09 21:57 |只看该作者
  1. int main(){
  2.         vector<TestObj> objvector;
  3.         objvector.reserve(10); // 添加
  4.         TestObj obj1;       
  5.         objvector.push_back(obj1);
  6.         Sleep(1000);
  7.         cout << "------------" << endl;
  8.         TestObj obj2;
  9.         objvector.push_back(obj2);
  10.         Sleep(1000);
  11.         cout << "------------" << endl;
  12.         TestObj obj3;
  13.         objvector.push_back(obj3);
  14.         Sleep(1000);
  15.         cout << "------------" << endl;
  16.                 system("pause");
  17. }
复制代码
你这样再跑一下,对比下结果,再查查reserve的作用就明白了

论坛徽章:
2
酉鸡
日期:2014-01-09 13:24:252015年亚洲杯之阿曼
日期:2015-02-13 00:43:51
3 [报告]
发表于 2014-01-09 22:36 |只看该作者
vector在增加大小的时候会把原有的内容复制到新的位置。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-11 06:20:00
4 [报告]
发表于 2014-01-10 09:15 |只看该作者
回复 2# c0ff


    原来这样,明白了,非常感谢!

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-11 06:20:00
5 [报告]
发表于 2014-01-10 09:15 |只看该作者
本帖最后由 linuxchyu 于 2014-01-10 09:19 编辑

回复 3# Fomalhaut2


    明白了,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP