我創建了一個A類和寫了下面的函數foo()內存分配混亂
class A
{
public:
int a;
};
A * foo()
{
A a1;
return &a1;
}
int main()
{
A * a2;
a2 = foo();
return 0;
}
編譯器給了我一個警告,因爲A1是一個局部變量,我從堆棧中返回它的地址(因此它的價值可以改變不可預知)。
現在我改變foo的()以下
A * foo()
{
A a1;
A *a3;
a3 = &a1;
return a3;
}
現在,編譯器不給任何警告。這是因爲a3是在堆上創建的嗎?如果是這樣,指針總是像這樣在堆上創建。我認爲堆只能通過new/malloc來使用。
在堆棧或堆上是a3嗎? – Bruce 2010-07-28 21:50:33
@Bruce:'a1'和'a3'都在堆棧中。當你從函數中返回指針'a3'的副本時,但是這對'a3'指向的對象沒有影響。 – 2010-07-28 21:52:18