[英]c++ pointer scope
當您擁有以下代碼時會發生什么:
void makeItHappen()
{
char* text = "Hello, world";
}
text
是否超出范圍並自動刪除或保留在內存中?
以下示例如何:
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
SomeClass::SomeClass() { }
SomeClass::~SomeClass()
{
std::cout << "Destroyed?" << std::endl;
}
int main()
{
SomeClass* someClass = new SomeClass();
return 0;
} // What happend to someClass?
這里有同樣的事嗎?
謝謝!
char* text = "Hello, world";
這里自動變量(指針)在堆棧上創建並設置為指向常量內存中的值,這意味着:
""
的字符串文字存在於整個程序執行中。 當指針超出范圍時,內存指針本身(4個字節)被釋放,字符串仍然在同一個地方 - 常量內存。
對於后者:
SomeClass* someClass = new SomeClass();
然后someClass
指針在超出范圍時也會被釋放(因為指針本身也在堆棧上,就在第一個例子中)...... 但不是對象!
關鍵字new
基本上意味着您為免費存儲上的對象分配一些內存 - 並且您負責在某個時間調用delete
以釋放該內存。
text
是否超出范圍
是! 它是函數makeItHappen()
本地函數,當函數返回時它超出了作用域。 但是指向字符串文字"Hello, world";
具有靜態存儲持續時間並存儲在存儲器的只讀部分中。
以下示例如何:
......
這里有同樣的事嗎?
您的第二個代碼示例泄漏內存。
SomeClass* someClass = new SomeClass();
someClass
是main()
本地,所以當main返回時,自動變量被破壞。 但是,指向的對象仍然存在於內存中,並且在函數返回后無法釋放它。 您需要顯式寫delete someClass
以正確釋放內存。
變量文本超出范圍(但不刪除字符串文字)。
對於使用new分配的對象(如SomeClass),您需要明確刪除它們。 如果你想要自動刪除像這樣分配的對象,請看一下boost智能指針 (std :: unique_ptr,如果你的編譯器是c ++ 0x)。
當共享指針超出范圍時,這將自動刪除已分配的對象。
您的代碼將如下所示:
int main(int argv, char **argv)
{
boost::scoped_ptr<SomeClass> ptr(new SomeClass);
// the object is automatically deleted
return 0;
}
注意:在此特定示例中,您還可以使用std :: auto_ptr(但這將在c ++ 0x中棄用)。
注2:正如Kos的評論中指出的那樣,在這種情況下使用boost :: scoped_ptr或std :: unique_ptr(c ++ 0x)更合適。 我的回答首先使用了boost :: shared_ptr,如果你需要在幾個類之間共享一個指針的所有權,這更合適。
在第一個示例中,字符串文字存儲在可執行文件的數據段中。
在第二種情況下,您不必調用delete
(在示例程序中只是終止),因為在程序終止時,無論如何都要為進程釋放堆。
請注意,雖然有操作系統(我已閱讀),但即使程序終止,您也必須顯式釋放堆,因為它不會在終止時為您清理。
當然,程序員負責C ++中的內存管理,並且在不需要時應delete
在堆上創建的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.