注册 登录
编程论坛 C++教室

程序运行出错了

zzt_428 发布于 2008-12-12 15:13, 1121 次点击
这是本人的一个编程作业题,是一个很简单的程序,编译可以通过,结果也能出现,但是有个严重的错误,因为出现结果的时候,总提示程序运行出错,我就是找不出来,希望哪位达人能指点我一下,感激不尽
//cow.h
#ifndef COW_H_
#define COW_H_

class Cow
{
private:
    char name[20];
    char *hobby;
    double weight;
public:
    Cow();
    Cow(char *nm, char *ho, double wt);
    Cow(const Cow &c);
    ~Cow();
    Cow & operator=(const Cow &c);
    void ShowCow() const;
};
#endif


//////////////////////////////////////////////////
//cow.cpp

#include <iostream>
#include "cow.h"
using namespace std;

//member methods

Cow::Cow()
{
    strcpy(name, "little white");
    
    hobby = new char[20];
    strcpy(hobby, "drink");
    weight=100;
}

Cow::Cow(const Cow &c)
{
    strcpy(name, c.name);
    int len=strlen(c.hobby);
    hobby=new char[len+1];
    strcpy(hobby, c.hobby);
    weight=c.weight;
}

Cow::Cow(char *nm, char *ho, double wt)
{
    strcpy(name, nm);
    int len=strlen(ho);
    hobby=new char[len+1];
    strcpy(hobby, ho);
    wt=weight;
}

Cow::~Cow()
{
    delete [] name;
    delete [] hobby;
}

Cow & Cow::operator =(const Cow &c)
{
    strcpy(name, c.name);
         int len=strlen(c.hobby);
    hobby=new char[len+1];
    std::strcpy(hobby, c.hobby);
    weight=c.weight;
    
    return *this;
}

void Cow::ShowCow() const
{
    cout << "name: " << name << endl;
    cout << "hobby: " << hobby << endl;
    cout << "Weight: " << weight << endl;

}

////////////////////////////////////////////
//usecow.cpp

#include <iostream>
#include "cow.h"
using namespace std;

int main()
{
    Cow cow1;
    Cow cow2("ketty", "eat", 100);
    //Cow cow3(cow2);

    cow1.ShowCow();
    cow2.ShowCow();
    //cow3.ShowCow();

    //Cow cow4=cow3;
    //cow4.ShowCow();

    return 0;
}
5 回复
#2
newyj2008-12-12 16:21
合并 起来 编译的 没有什么 错误提示?
在 ~Cow() 去掉delete [] name; 在operator = 加上 delete []hobby;
#3
zqm02092008-12-12 19:29
楼上正解,name[20]是字符串数组,分配的存储空间在栈上,由程序自动释放,没有使用堆中的动态内存,不需要用delete回收内存空间
#4
zzt_4282008-12-12 20:33
2楼说的有道理。
hobby 应该用 delete[]
在类中定义的指针,应该在析构函数中用delete 把它释放,因为默认的析构函数仅仅是释放指针,而没有释放指针所指向的空间,那么,在类中定义的数组,要在析构函数中 把它释放吗?
#5
sunkaidong2008-12-13 09:54
动态数组需要,一般数组不需要...
#6
zzt_4282008-12-13 14:04
感谢!我还了解到一种内存是需要显式调用析构函数的,那就是使用new布局操作符分配的内存。
比如说
 char * buffer= new char[512];
 Testing *pc = new (buffer) Testing;
则应该使用
pc->~Testing();
1