错在那了?

来源:互联网 发布:python矩阵运算 编辑:程序博客网 时间:2024/04/29 21:28

 

#ifndef __string_h__
#define __string_h__
#include <string.h>
#endif
class data
{
private:
    char *name;
    int id;
    char sex;
    static int count;
public:
    data(char *p)
    {
        name=new char [strlen(p)+1];//写成(strlen(p)+1)
        strcpy(name,p);    //析构函数delete name时发生段错误
    }
    void set_id(int i);
    void set_sex(char sex);
    int get_id(void);
    char get_sex(void);
    char *get_name(void);
    friend void spy(const data &a);
    void display(void);
    ~data()
    {
     delete name;
    }
};

p为字符串指针,写成name=new char(strlen(p)+1);

   strlen(p)返回字符串长度,这样strlen(p)+1就是一个数字,而数字和字符对与编译器来说是一样的,所以new char(strlen(p)+1)实质是申请了一个int大小的空间,后边strcpy(name,p);实质是将一段字符串复制到一个int大小的空间,而这个空间肯定是容不下这个字符串,而此时内存中相邻的字段没有被其他进程占用,而发生越界复制,而在退出时,delete时,会销毁内存,而一部分内存不属于本进程,而发生段错误。

如果写成name=new char[strlen(p)+1];就告诉编译器申请空间的内型是char 而申请的大小是strlen(p)+1,   错误的主要原因还是没有熟练c++,新手啊,才学了2天。加油 

 

阅读(470) | 评论(0) | 转发(0) |
0

上一篇:如果有来生,让我们相拥依旧···【超感人,转载下】

下一篇:c++学习札记 构造函数与析构函数

相关热门文章
  • Windows下 webrtc voice engin...
  • 邮政快递代收货款 邮票...
  • www.fenghuangyulepingtai.com...
  • 优游娱乐平台 时时彩玩法图解-...
  • www.ub8.cm 76、时时彩转15选5...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • GCC编译命令
  • 推荐系统常用算法
  • C++Primer笔记 第八章 标准IO...
  • c语言中的#号和##号的作用...
  • gstreamer插件开发-------sink...
给主人留下些什么吧!~~
原创粉丝点击