c ++字符串分配

rnd*_*gen 7 c++ memory string

我需要处理关于c ++"string"对象的内存分配,范围和删除吗?

例如:

#include <string>

const char* func1() {
   const char* s = "this is a literal string";
   return s;
}

string func2() {
   std::string s = "this is a literal string";
   return s;
}

const char* func3() {
   std::string s = "this is a literal string";
   return s.c_str();
}

void func() {
   const char*  s1 = func1();
   std::string s2 = func2();
   const char*  s3 = func3();

   delete s1; //?
   delete s3; //?
}
Run Code Online (Sandbox Code Playgroud)

func2:我不需要'删除's2.func3:我需要'删除s3'吗?

顺便说一下,func1是否正确?离开func1范围后,字符内存内容是否仍然可用?如果是,我不再需要它时应该删除它吗?

sbi*_*sbi 16

  • func1()返回指向字符串文字的指针.您不能删除字符串文字.
  • func2()(大概是,你省略了std::前缀)返回一个std::string.它照顾好自己.
  • func3()返回一个指向字符串的指针,该字符串由std::string函数退出时被销毁的对象管理.函数返回后,不得触摸该指针.
  • 您必须处理此函数返回的内存:

    const char* func4() {
       char* s = new char[100];
       // fill char array with a string
       return s;
    }
    
    Run Code Online (Sandbox Code Playgroud)

但是,手动资源管理很棘手.对于初学者,如果函数返回一个裸指针,则不知道它是指向一个对象(char)还是其数组以及是否需要删除它.你应该避免这一切,只要坚持下去std::string.