错误1
char* a = new char[100];
for (int i = 0; i < 100; i++)
*(a++) = 0;
看起来没有什么问题,事实上,指针a指向的地址在不断变化,最后需要释放空间时会出错,具体原因还不太清楚:
delete[] a; // error: violate access ...
正确的做法之一:
char* a = new char[100];
int* p = a;
for (int i = 0; i < 100; i++)
*(p++) = 0;
正确的做法之二:
int* a = new char[100];
for (int i = 0; i < 100; i++)
*(a + i) = 0;
正确的做法之三:和之二是一回事
char* a = new char[100];for (int i = 0; i < 100; i++)
a[i] = 0;
delete[] a;
错误2:同样的错误还有:
char* a = new char[100];
a = "abcdefg"; // 此处a指向了常量区
delete[] a; // error: violate access ...
正确的做法是:
char* a = new char[100];
strcpy (a, "abcdefg");
delete[] a;
注意: 分配的空间应 >= strlen ("abcdefg") + 1
错误3:这个错误高级一点
以下写法大概算正确的了
class Person
{
friend ostream& operator << (ostream& s, const Person& obj);
friend istream& operator >> (istream& s, Person& obj);
private:
char* name;
public:
Person (char* n = "")
{
name = new char[128]; // name = new char[sizeof (n)]; name = new char [strlen (n) +1] ### 1
strcpy (name, n);
}
~Person ()
{
delete[] name;
}
};
ostream& operator << (ostream& s, const Person& obj)
{
s << obj.name << endl;
return s;
}
istream& operator >> (istream& s, Person& obj)
{
s >> obj.name; // ### 2
return s;
}
int main (void)
{
Person a ("Xiaozhang");
cout << a;
cin >> a; // ### 3
cout << a;
Person b;
cout << b;
cin >> b;
cout << b;
return 0;
}
#1如果采用注释里的写法 name = new char[sizeof (n)]; 这里分配4字节空间,而name = new char [strlen (n) +1],那么, 在#3处如果输入了"Xiaozhang"还长的字符串,那么,#2处会重新对字符串长度进行计算,析构函数里的 delete[] name; 就会出错!所以,在#1处多分配点空间也是个办法,或者就是用string。http://blog.csdn.net/BEN1978/archive/2006/05/13/727300.aspx
这里有个问题还是不解,还请了解的DX们解惑:
delete[] name; 到底是怎么在运行的?错误1 里 name 的地址变化了,而 错误3 里 name 的地址没有变化,但是如果其长度变长,delete[]就产生了问题。不知道这样的说法是否可行。