我有关于C++中字符串的以下问题
1 >>这是一个更好的选择(考虑性能),为什么?
1.
string a; a = "hello!";
要么
2.
string *a; a = new string("hello!"); ... delete(a);
2 >>
string a; a = "less"; a = "moreeeeeee";
当更大的字符串被复制到更小的字符串时,如何在c ++中处理内存管理?c ++字符串是否可变?
几乎从来没有必要或不希望这样说
string * s = new string("hello");
毕竟,你(几乎)永远不会说:
int * i = new int(42);
你应该说
string s( "hello" );
要么
string s = "hello";
是的,C++字符串是可变的.
以下所有内容都是天真的编译器所能做的.当然,只要它不改变程序的行为,编译器就可以自由地进行任何优化.
string a; a = "hello!";
首先,初始化a以包含空字符串.(将长度设置为0,以及一个或两个其他操作).然后分配一个新值,覆盖已设置的长度值.它可能还必须执行检查以查看当前缓冲区有多大,以及是否应分配更多内存.
string *a; a = new string("hello!"); ... delete(a);
调用new需要操作系统和内存分配器找到一块空闲的内存.那很慢.然后立即初始化它,因此您不需要分配任何两次或者需要调整缓冲区的大小,就像在第一个版本中那样.然后发生了一些不好的事情,你忘了调用delete,除了一个分配极慢的字符串之外你还有内存泄漏.所以这很糟糕.
string a; a = "less"; a = "moreeeeeee";
与第一种情况一样,您首先初始化a以包含空字符串.然后你分配一个新的字符串,然后另一个.其中每个都可能需要调用new来分配更多内存.每行还需要长度,可能还需要分配其他内部变量.
通常,你会像这样分配它:
string a = "hello";
一行,执行初始化一次,而不是先进行默认初始化,然后分配所需的值.
它还可以最大限度地减少错误,因为程序中的任何位置都没有无意义的空字符串.如果字符串存在,则它包含您想要的值.
关于内存管理,谷歌RAII.简而言之,字符串在内部调用new/delete来调整其缓冲区的大小.这意味着您永远不需要使用new分配字符串.字符串对象具有固定的大小,并且被设计为在堆栈上分配,以便析构函数在超出范围时自动调用.析构函数然后保证释放任何已分配的内存.这样,您不必在用户代码中使用new/delete,这意味着您不会泄漏内存.