VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 174|回复: 5

[已解决]【实用C++】零基础入门教程--第35课的视频教程中 有个疑问

[复制链接]
18_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-16 22:07:19 | 显示全部楼层 |阅读模式
视频教程中,析构函数中使用了delete p_name。
那么主函数main里,为什么不需要delete pStud呢?

最佳答案
75_avatar_small
2020-4-17 01:15:13
本帖最后由 wl1383838438 于 2020-4-17 01:22 编辑

我的理解是,CStudent *stud = new CStudent("abc");你这个是在main函数中定义的,严肃的来说在不使用的时候,是需要删除的,至于你说的在析构函数中为什么删除 if (p_name)delete[] p_name;
你目前应该还没有学习到构造函数,其实你提了一个很好的问题,为什么main书中不删除?是因为你自己没有删除,这样会导致,函数无法调用你的析构函数,(但是你在main删除指针的时候,会默认调用你提供的析构函数,但是你的析构函数中又在删除一次? 这样程序就会崩溃的,触发断点!你自己可以把//的注释去掉自己试试!)
你指定了析构函数,这个时候系统并不会在为你提供默认的析构函数(通常情况下你不写析构函数,系统会为你提供默认的析构函数,((至于什么情况下目前你不用去关心),你在此处new 了一个堆栈,那么在不使用的时候应当删除指向该堆栈的指针,这样才会正确的释放堆栈,目前你都不需要关心,你只需要记住以下几点)  在后期 你慢慢地都会学到这方面的知识,现在不让你拓展是为了 不让你迷迷糊糊,和你说了,反而你可能更加不理解!
1,程序申请了堆栈那么在不使用的时候,一定要删除
2,指针在不使用的时候,一定要stud=null,
3,自己写了析构函数,那么一定要在主函数中调用,不然函数无法正常析构,
4,尽量在写函数的时候,加一些提示,如cout<<"某某函数执行中"<<endl;

析构不要写2次
        ~CStudent();虽然不会再执行它,但是很容易让你迷糊

后面给你代码,你自己看看吧!
在后期 你慢慢地都会学到这方面的知识,现在不让你拓展是为了 不让你迷迷糊糊,和你说了,反而你可能更加不理解!
构造函数
析构函数    都能正确的执行,并且堆栈也能够释放!
【实用C++】零基础入门教程--第35课的视频教程中 有个疑问




上一篇:很多api函数的头文件csdn没有,去哪里找
下一篇:ReadString读取文本为什么只读了一行就退出不读了?
75_avatar_middle
最佳答案
18 
online_supermod 发表于 2020-4-16 22:11:50 | 显示全部楼层
你把代码贴出来
18_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-16 22:22:57 | 显示全部楼层

视频教程里的很长,我没按教程里的原代码复制,大意就是下面这个样子。
就是没明白为什么主函数main里没有使用delete。

  1. #include<iostream>
  2. #include<string>
  3. class CStudent
  4. {
  5. public:
  6.         char *p_name;
  7.         CStudent(char* pname);
  8.         ~CStudent();
  9. };
  10. CStudent::CStudent(char* pname)
  11. {
  12.                 p_name = new char[10];
  13.                 int n = strlen(p_name) + 1;
  14.                 strcpy_s(p_name, n, pname);
  15. }
  16. CStudent::~CStudent()
  17. {
  18.         if (p_name)delete[] p_name;//这里使用了delete,可是主函数main里为什么没有
  19. }

  20. int main(int argc, char* argv[])
  21. {
  22.         CStudent *stud = new CStudent("abc");
  23.         //?????这里为什么不用delete stud
  24.         return 0;
  25. }
复制代码
51_avatar_middle
最佳答案
79 
online_admins 发表于 2020-4-16 22:25:35 | 显示全部楼层
张小顺 发表于 2020-4-16 22:22
视频教程里的很长,我没按教程里的原代码复制,大意就是下面这个样子。
就是没明白为什么主函数main里没 ...

这里面是需要 delete 的,new 和 delete 要成对使用
20_avatar_middle
最佳答案
4 
在线会员 发表于 2020-4-16 23:53:21 | 显示全部楼层
原则上是new出来的空间,不用的时候就要delete,否则就会出现内存泄漏的问题。
在main函数中new出来的空间,不用了也是需要delete的,如果忘记delete没关系的,因为main函数执行完return 0;之后,整个程序进程就结束退出了,也不存在什么内存泄漏了。
75_avatar_middle
最佳答案
18 
online_supermod 发表于 2020-4-17 01:15:13 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 wl1383838438 于 2020-4-17 01:22 编辑

我的理解是,CStudent *stud = new CStudent("abc");你这个是在main函数中定义的,严肃的来说在不使用的时候,是需要删除的,至于你说的在析构函数中为什么删除 if (p_name)delete[] p_name;
你目前应该还没有学习到构造函数,其实你提了一个很好的问题,为什么main书中不删除?是因为你自己没有删除,这样会导致,函数无法调用你的析构函数,(但是你在main删除指针的时候,会默认调用你提供的析构函数,但是你的析构函数中又在删除一次? 这样程序就会崩溃的,触发断点!你自己可以把//的注释去掉自己试试!)
你指定了析构函数,这个时候系统并不会在为你提供默认的析构函数(通常情况下你不写析构函数,系统会为你提供默认的析构函数,((至于什么情况下目前你不用去关心),你在此处new 了一个堆栈,那么在不使用的时候应当删除指向该堆栈的指针,这样才会正确的释放堆栈,目前你都不需要关心,你只需要记住以下几点)  在后期 你慢慢地都会学到这方面的知识,现在不让你拓展是为了 不让你迷迷糊糊,和你说了,反而你可能更加不理解!
1,程序申请了堆栈那么在不使用的时候,一定要删除
2,指针在不使用的时候,一定要stud=null,
3,自己写了析构函数,那么一定要在主函数中调用,不然函数无法正常析构,
4,尽量在写函数的时候,加一些提示,如cout<<"某某函数执行中"<<endl;

析构不要写2次
        ~CStudent();虽然不会再执行它,但是很容易让你迷糊

后面给你代码,你自己看看吧!
在后期 你慢慢地都会学到这方面的知识,现在不让你拓展是为了 不让你迷迷糊糊,和你说了,反而你可能更加不理解!
构造函数
析构函数    都能正确的执行,并且堆栈也能够释放!
【实用C++】零基础入门教程--第35课的视频教程中 有个疑问
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-8-9 13:12

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表