string getValue()
{
char *p = new char[1042];
strcpy(p, "123456789");
string s = p;
return s;
}
int main()
{
char buf[1024] = {0};
string s = getValue();
_vsnprinf_s(buf, sizeof(buf), "%d,%s", 2, s);
}
在getValue函数内通过new创建的空间,通过string返回,在main函数里这个string值能正常使用吗?会不会导致异常
从代码看,不管p有没有被释放,main函数中s都可以正常使用,只不过不释放会导致内存泄露。
前面的同学已经提到 s=p之后,s是自己开辟一个空间,把字符串复制过去,和p就没有关系了。
你再程序中遇到问题,我怀疑是不是new的空间太小,第二句 strcpy(p, "123456789"); 拷贝的内容超过了你new的大小。比如你这里new的是1024,假设改为5,或者把 strcpy 的字符串长度超过1024,都会导致问题。
new出来的直到delete前都能用。
你不用new申请空间,return的string对象外部也是可以使用的,因为会进行复制。
有异常:
测验代码:
#include <iostream>
#include <stdio.h>
#include <stdarg.h>
using namespace std;
string getValue()
{
char *p = new char[1042];
strcpy(p, "123456789");
string s = p;
return s;
}
int main()
{
char buf[1024] = {0};
string s = getValue();
//_vsnprintf_s(buf, sizeof(buf), "%d,%s", 2, s);
//printf("%d",sizeof(s));
printf("%s\n",s);
system("pause");
return 0;
}
补充下,前面漏了点代码,在返回string前有把new的内存释放了,这样使用返回的string值会不会异常
实际使用时在一台机子上异常了,就是用返回的string值通过log4cplus进行格式化字符串日志打印