2013-10-10 110 views
0

我遇到了一個我無法解釋的奇怪的東西。指針成員默認情況下不會初始化爲零(僅在第二次發生時)。我知道我忘了在構造函數中初始化它,並在d-tor中釋放內存。但我無法解釋爲什麼指針默認未初始化爲零。下面是工作的僞代碼。我貼出來是爲了向你們展示我的意思。在我真實的代碼中,它要複雜得多。爲什麼指針成員初始化爲非零?

到目前爲止,我的猜測是有內存泄漏的地方。如果有更多的可能性,我希望聽到您的消息。謝謝。

#include <iostream> 

class A { 
public: 
    int *p; 
    A() {std::cout << "p in ctor: " << p << std::endl;} 
    ~A() {} 
    void f(int *i) { p = i;} 
}; 

int main() { 
    A *a = new A(); 
    int c = 0; 
    a->f(&c); 
    std::cout << "p in step 1:" << a->p << std::endl; 
    delete a; 
    A *b = new A(); 
    std::cout << "p in step 2:" << a->p << std::endl;//here works but not in real code 
} 
+3

'默認情況下'指針是未初始化的。如果你沒有手動初始化它,它可能是任何東西(調試版本已知的非空常量,發佈的隨機垃圾) – keltar

+0

你應該初始化你的變量並且知道它。 –

+0

因爲'int * p',最好使用'int * p = NULL',因爲你正在做的事是未定義的行爲 – Najzero

回答

7

But I cannot explain why the pointer is not initialized to a zero by default. - 這就是C++的工作原理。它沒有初始化任何東西。通過省略初始化部分,您明確指出您不希望它被初始化。

+0

謝謝,我以爲它會默認初始化爲零。 :-)但爲什麼成員p在我上面的例子中初始化? (我正在使用g ++ 4 BTW) – Orunner

+0

@Orunner第二次碰到'ub',因爲你在刪除'a'後訪問'a-> p'。 –

+0

「普通舊數據」(POD)類型(如指針)不會被零初始化,除非它們的默認構造函數被顯式調用。如果你用c中的A():p(){std :: cout <<「p替換你的構造函數:」<< p << std :: endl;}'它應該被初始化爲零。 – Medinoc

1

如果沒有明確地做,您的內建類型的成員不是零初始化的