new一个数据,在初始化时的不慎,将导致 delete[] 时出错,列举了几点参考

错误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[]就产生了问题。不知道这样的说法是否可行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值