关于返回局部变量地址的有关问题

关于返回局部变量地址的问题
程序中,有时候会提示是返回局部变量地址,而有时候却不,
如下面的程序:
 
string* fff()
{
 string str("ha");
 return &str;
}
 属于返回局部变量地址,
而:
int* fff()
{
int p1 = 10;
 int *p = &p1;
 return p;
}

却不会提示返回局部变量地址,p1和p都属于局部变量,应该都是在栈上分配的吧,
是不是说,如果哦局部地址是通过调用构造函数产生的,则不能返回,如果是普通变量,则可以呢?
求解,

------解决方案--------------------
这两种都不应该使用,都是返回的局部变量的地址,函数结束后这个地址保存的数据已不能保证正确了,使用有很大风险。
------解决方案--------------------
语法有错的,编译器一定报错的。对于于有潜在风险的代码,编译器未必都要报错,否则就不会有那么多的bug
------解决方案--------------------
程序不该依赖编译器是否报错,类似潜在的bug编译器是无法发现的(至少现在是这样),如果你在一个函数中返回局部变量的地址,而此局部变量(static成员例外)一旦函数调用完毕其生命周期就结束了,此时,如果你再去访问这个地址,虽然有时能正确的取到数据,但只是碰巧的情况,所以如果需要的话,最好还是在堆上为其分配个内存的好
------解决方案--------------------
int* fff()
{
int p1 = 10;
 int *p = &p1;
 return p;
}

典型的bug代码之一,欺骗了编译器也欺骗了自己

------解决方案--------------------
第一个是直接返回局部变量的地址的!
第二个是通过一个指针指向,返回指针的内容的而已!
虽然意思都是相同的!但是编译器没有这么智能!退一步说,这个只能说是一个严重bug,语法没有问题!
------解决方案--------------------
引用:
Quote: 引用:

这两种都不应该使用,都是返回的局部变量的地址,函数结束后这个地址保存的数据已不能保证正确了,使用有很大风险。
 如果我是new了一个,比如 int *p = new int[5]; return p; 这是不是可以的,
new出来的都是在堆上存在的,而堆需要我们自己来管理,
正确!
------解决方案--------------------
只能说能否访问到,要看电脑的心情,高兴了给你返回正常的值,不高兴了就给你想不到的值,千万别这么搞,会出大事的