2014-07-08 17 views
0

以下C++程序編譯良好,但給出了運行時,下面的錯誤(Runtime check failure):C++具體地解決了錯誤:變量「T」被使用而不被初始化

The variable 't' is being used without being initialized

#include <iostream> 
#include<conio.h> 

using namespace cv; 
using namespace std; 


void foo (int * count) 

{ 
    *count=90; 

} 

int main() 


{ 

    int *t; 

    foo(t); 

    cout<<t[0]<<endl; 

    return 0; 

} 

我會刪除這個錯誤在C中是這樣的:

int main() 


{ 

    int *t; 

    t= (int *) malloc(sizeof(int)); 

    foo(t); 

    cout<<t[0]<<endl; 


    getch(); 
    return 0; 

} 

這個錯誤的C++特定解決方案是什麼?

+0

你想對「新」做些什麼研究。 – Aesthete

+0

再次閱讀你的代碼,你發現一個版本有多一行?並再次閱讀錯誤消息,你明白嗎? –

回答

1

在使用指針之前,應將指針初始化爲指向特定的內存地址。如果不是這樣,它可能指向任何東西。這可能會導致程序非常不愉快的後果。例如,操作系統可能會阻止你訪問它知道你的程序不擁有的內存:這會導致你的程序崩潰。如果它讓你使用內存,你可能會混淆任何正在運行的程序的內存 - 例如,如果你有在Word中打開的文檔,你可以改變文本!幸運的是,Windows和其他現代操作系統將阻止您訪問該內存並導致程序崩潰。爲避免程序崩潰,在使用前應始終初始化指針。

也可以使用空閒內存來初始化指針。這允許動態分配內存。這對於設置鏈接列表或數據樹等結構非常有用,因爲在編譯時您不知道需要多少內存,因此您必須在程序執行期間獲取內存。

+0

如果沒有malloc()(以及將在空閒區域分配的類似東西),你將如何初始化內存? – user2799508

+0

要麼你可以使用'new'或者使用'calloc()'。 在你的查詢中,指針已經做成't',然後你必須在你的內存中分配它。你可以分配堆或堆棧。 'calloc()'將幫助你在初始化之前分配內存。 –

+0

無論如何,我已經運行了你的程序[見這裏](http://ideone.com/I7gM3v),它運行成功。所以,基本上它依賴於編譯器以及它如何管理內存分配。 –

4

除非你有特別的理由,否則最好分配在棧上,而不是在堆上:

#include <iostream> 

void foo (int *count) 
    *count = 90; 
} 

int main() { 
    int t; 
    foo(&t); 
    std::cout << t << "\n"; 
} 

如果你真的必須在堆上分配,喜歡智能指針(如std::unique_ptr)至擁有原始指針:

#include <iostream> 
#include <memory> 

void foo (int *count) { 
    *count = 90; 
} 

int main() { 
    auto t = std::make_unique<int>();    // C++14 
    // auto t = std::unique_ptr<int>(new int()); // C++11 
    foo(t.get()); 
    std::cout << *t << "\n"; 
} 

那麼你並不需要調用delete(或new在C++ 14)。

+0

+1,與'new'無關。唯一的要求是指針指向一個有效的「int」對象。它如何分配並不重要。 – juanchopanza

+0

不錯的做法。 +1 –