VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 271|回复: 5

动态new一个空间后使用memset清空,在析构函数中delete就会出错

[复制链接]
18_avatar_middle
最佳答案
0 
在线会员 发表于 2021-2-8 16:59:11 | 显示全部楼层 |阅读模式
CStudent::CStudent(char* pname, char t_sex, int t_num, int t_age) :sex(t_sex), num(t_num), age(t_age)
{
        type = EStudent_Error;

        p_name = NULL;
        int n_len = 0;
        if (pname)
        {
                n_len = strlen(pname);
        }
        if (n_len > 0)
        {
                p_name = new char(n_len + 1);
                memset(p_name, 0, n_len + 1);
                strcpy(p_name, pname);

                //p_name = pname;
        }
}

CStudent::~CStudent()
{
        if (p_name)
        {
                delete[] p_name;
                p_name= NULL;
        }
        cout << "~CStudent() called." << endl;

}

                memset(p_name, 0, n_len + 1);
                strcpy(p_name, pname);

发现使用以上这两段程序后开始执行后会提示 .exe以停止工作!




上一篇:Visual C++宽字符与窄字符,控件绑定的作用?
下一篇:关于shared_ptr问题
04_avatar_middle
最佳答案
9 
online_vip 发表于 2021-2-9 17:49:39 | 显示全部楼层
你都没有发现你这代码根本就跑不下去么?
18_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-2-9 19:46:05 | 显示全部楼层
xiao14116 发表于 2021-2-9 17:49
你都没有发现你这代码根本就跑不下去么?

还请大师指点动态new一个空间后使用memset清空,在析构函数中delete就会出错
04_avatar_middle
最佳答案
9 
online_vip 发表于 2021-2-9 19:58:01 | 显示全部楼层
int n_len = 0;
        if (pname)
        {
                n_len = strlen(pname);
        }
        if (n_len > 0)
        {
                p_name = new char(n_len + 1);
                memset(p_name, 0, n_len + 1);
                strcpy(p_name, pname);
                //p_name = pname;
        }
n_len > 0这个条件不可能成立
18_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-2-9 21:54:07 | 显示全部楼层
xiao14116 发表于 2021-2-9 19:58
int n_len = 0;
        if (pname)
        {

可以成立!!
85_avatar_middle
最佳答案
1 
在线会员 发表于 2021-2-16 23:42:00 | 显示全部楼层
动态new一个空间后使用memset清空,在析构函数中delete就会出错

我写了一个差不多的,没有任何问题:

动态new一个空间后使用memset清空,在析构函数中delete就会出错


  1. #include <string.h>
  2. #include <stdio.h>
  3. // ------------------------
  4. class Student{
  5.    
  6. public:
  7.    
  8.     char * student_name = NULL;
  9.     Student(char * name);
  10.     void WhatName();
  11.     ~Student();
  12. };

  13. Student::Student(char * name){
  14.         int name_len = 0;
  15.         if(name){
  16.             name_len = strlen(name);
  17.         }
  18.         // length ..
  19.         if(name_len > 0){
  20.             student_name = new char(name_len + 1);
  21.             memset(student_name, 0, name_len + 1);
  22.             strcpy(student_name, name);
  23.         }
  24. }

  25. void Student::WhatName(){
  26.         printf("Name : %s\n", student_name);
  27. }

  28. Student::~Student(){
  29.         printf("Destroy \n");
  30.         if(student_name){
  31.             printf("Delete student_name \n");
  32.             delete [] student_name;
  33.             student_name = NULL;
  34.         }
  35. }

  36. int main()
  37. {
  38.     char name[] = "Alice";
  39.     Student * Alice = new Student(name);
  40.     Alice->WhatName();
  41.     delete Alice;
  42.     return 0;
  43. }
复制代码
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2021-5-10 15:52

Powered by CcTry.CoM

© 2009-2021 cctry.com

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