char *r = "abc";
delete r;
想问一下这样delete为什么是错误的,忘记"abc"所在的内存空间叫什么了看了一下STL string 的实现,也就是xstring。发现如果是string的话,那么对一个string的赋值操作都是复制另一个string的内容,而不会使自己指向那个string,这个也很合理。但是突然觉得用string虽然很爽,但是效率不是很高,如果能确保某个字符串在始终存在的话,比如在在传参数的时候1.
void Fun(string name)
{
......
}int main()
{
  string str = "abc";
  Fun(str);
  return 0;
}2.
void Fun(LPCTSTR pszName)
{
........
}int main()
{
  string str = "abc";
  Fun(str.c_str);
  return 0;
}
只要保证在Fun使用中,string不会析构掉,那么显然2比1高效很多,问一下各位我说的对吗?顺便帮我解答一下上面的问题,谢谢

解决方案 »

  1.   

    使用了new才使用delete,它们是成对出现的
      

  2.   

    LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。 
    而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。 
    由于const char* 最简单(常量,不涉及内存变更,操作迅速)
      

  3.   

    "abc"存放于常量区,不能修改,也不用delete,因为没有new对应。
    另外,string的问题,可以用引用传递参数,就不会复制对象了,即:
    void Fun(string& str)
      

  4.   

    char *r = "abc";
    delete r;delete和new要对应使用,char *r = "abc",这是一个常量字符串,内存在静态存储区,不用你管的。STL的东西的实现很多都存在对象复制,会影响效率,但是也保证了内存的安全,在1中你把传入参数改为引用就可以避免字符串的复制啊,effective C++中有说的。void Fun(const string &name){
    ......
    }int main()
    {
      string str = "abc";
      Fun(str);
      return 0;
    }
      

  5.   

    "abc" 这个字符串存放于常量区,new和delete对应
    可以传递引用,避免复制的开销