我需要处理关于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.