Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1651997
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: C/C++

2009-04-10 20:34:18

 

#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天。加油 

 

阅读(1015) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~