簡體   English   中英

c ++指針范圍

[英]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();

someClassmain()本地,所以當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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM