C++类中指针初始化注意问题
首先了解一下编译器自动生成的赋值函数和operator =函数, 如果你成员变量没有指针那么没什么问题,自带的copy函数会逐bits 的copy,但是如果你类中定义了指针那么问题大了,他会很傻傻的把参数的指针的地址赋值给你的指针,那么你现在类的指针和传入的类的指针指向同一片内存空间,如果那个类释放掉了,那么你的指针指向的就是一片空的内存空间,那么显而易见会出现未知错误。再者当这两个类都析构的时候,那么同一片内存空间就会释放掉两次,这又会出现内存错误。
所以: 我的理解是你要写,要自己重写。认真的把自己指针用new分配内存,然后把别人的指针所有内容赋值过来,不要偷懒。 还有凡是new出来的内存空间存在于堆里,请在析构函数中把他delete掉,不然会内存泄露.
错误例子:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Cow
{
private:
char name[20];
char *hobby;
double weight;
public:
Cow();
Cow(const char *nm, const char * ho, double wt);
//Cow(const Cow &c);
// Cow operator=(const Cow &c);
Cow operator+(Cow &b);
void ShowCow();
~Cow();
};
Cow::Cow()
{
name[0] = '\0';
hobby = NULL;
weight = 0.0;
}
Cow::Cow(const char *nm, const char * ho, double wt)
{
strcpy(name, nm);
hobby = new char[strlen(ho)+1];
strcpy(hobby, ho);
weight = wt;
}
Cow Cow:: operator+( Cow &b)
{
weight = weight + b.weight;
return *this;
}
Cow::~Cow()
{
cout<<hobby<<" was delete\n";
// delete[] hobby; //如果这里起用delete,程序编译通过,运行时会出错,如图所示。
}
void Cow::ShowCow()
{
cout<<"----------------------"<<endl;
cout<<name<<endl;
cout<<hobby<<endl;
cout<<weight<<endl;
}
int main()
{
Cow a("abc", "ett", 20.0);
a.ShowCow();
Cow b("etw","iop", 30.0);
b.ShowCow();
Cow c = a+b;
// cout<<a+b;
c.ShowCow();
return 0;
}
错误分析:
第一个 就是没有写copy函数和operator=函数,导致操作不明确不清晰。
第二个 并没有返回一个&引用类型,而是pass-by-value这种值传递,那么c=a+b的时候 编译器会创建临时变量,然后再通过这个临时变量赋值给c,(由于使用的是编译器自动生成的赋值函数,那么指针只是简单的地址赋值,那么就是说临时变量的指针和c的指针指向同一片区域),当赋值结束的时候,临时变量被释放,指针delete了,这时候c.show()访问了空的内存空间,所以报错误。
第三个 应该自己写copy和copy=函数,然后实现指针new空间,复制内容的过程。
第四个 new的空间在堆中,不能自己去释放掉他,需要delete掉
第五个 如果类继承自父类,那么赋值也要考虑父类部分的赋值,copy函数规范 copy调用copy operator=调用operator=函数。 并且需要判断自己赋值自己的可能,因为父类的指针可以指向子类,这些请看其他专题