我有一个简单的函数,它充当指向对象的指针的吸气剂
public class WebViewAppApplication extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
// init logcat
Logcat.init(WebViewAppConfig.LOGS, "WEBVIEWAPP");
// init analytics
FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(!WebViewAppConfig.DEV_ENVIRONMENT);
// init AdMob
MobileAds.initialize(this, WebViewAppConfig.ADMOB_APP_ID);
}
@Override
public String getPurchaseCode() {
return WebViewAppConfig.PURCHASE_CODE;
}
@Override
public String getProduct() {
return Kozuza.PRODUCT_WEBVIEWAPP;
}
我忘了在上述简单函数中编写return关键字,并对其进行了编译并成功运行。
然后我发现缺少一个return关键字,因此我启动GDB试图了解它是如何工作的,我发现该函数实际上返回了所需的指针。
我尝试了更简单的示例
wxAuiNotebook* Frame::GetNoteBook(unsigned short index)
{
NotebooksContainer->GetBook(index);
}
GCC编译器在编译过程中不会引发错误,但是对象的地址完全不同。 在G ++ 4.3.3下获得了以下输出
class A {
private:
std::string* pstr;
public:
std::string* GetPstr()
{
std::cout << pstr << std::endl;
pstr;
}
void SetPstr(std::string* val)
{
pstr = val;
}
};
int main() {
A a;
std::string jfox("This is Jumping Fox");
a.SetPstr(&jfox);
std::cout << a.GetPstr() << std::endl;
return 0;
}
注意:同一简单示例在MSVC 2015下引发错误。
据我所知,有些语言-例如。 Ruby-将函数的最后一条语句的结果作为返回值返回,但这不适用于C ++。
为什么在原始示例中返回相同的指针,以及在简单示例中为何返回不同的指针呢?
我愿意接受更多实验。
答案 0 :(得分:3)
这是未定义的行为。在许多情况下,它看起来像在工作,因为要返回的值位于预期的位置(例如x86 / x64上的CPU寄存器EAX),但这是一个巧合,您不能依靠任何东西。