2016-10-28 110 views
0

從我所瞭解到的情況來看,動態分配的變量需要使用delete操作符來刪除,並且不會在範圍末尾自動刪除,例如靜態變量。C++ - 動態分配變量的範圍

因此,在以下示例中,當循環運行第2次和第3次時,不應該爲「int * p = new int;」由於動態分配的內存'p'沒有被刪除,因此被多次初始化?

#include<iostream> 
using namespace std; 

void main() 
{ 
    int i = 2; 

    while (i > -1) 
    { 
    int *p=new int; 

    *p = 5; 

    cout << *p; 

    --i; 
    } 
} 

使用Visual Studio 2015,上述程序沒有提供任何錯誤。根據我的理解,這沒有任何意義。

我假設我的理解動態分配的變量有問題。任何人都可以澄清?

回答

1

你的代碼顯示了所謂的「內存泄漏」。當p超出範圍而沒有首先使用存儲器時,爲每個循環迭代分配的存儲器將丟失。這(通常)不會導致編譯器警告或運行時錯誤,因爲編譯器找到這種錯誤可能相當複雜。一些靜態代碼分析器可能能夠檢測到這一點。

在內存泄漏的情況下,您可能會注意到,程序運行時間越長,內存泄漏在內存較低的系統和長時間運行的程序中尤其成問題,啊系統服務應該運行幾天。

有特殊的工具來查找內存泄漏,例如用於Linux的valgrind或用於Visual Studio的調試運行時的內置工具。

0

您不能動態分配變量,只能對象。

p不是動態分配的對象,而是*p - 由new創建的對象 - 是。
delete p不會刪除p但它指向的對象。

範圍是一個適用於名稱的語法編譯時間屬性。

具有名稱的變量p具有範圍。
它指向的對象是未命名的,因此範圍的概念甚至不適用於它。

在運行時,p和它指向的對象都有一個生命週期。

p的壽命與其範圍相符,因爲它是一個自動變量。循環的每次迭代都有自己的變量,所有變量都具有相同的名稱 - 沒有多個初始化,因爲變量是不同的。

p指向的對象的生命週期,直到它的地址傳遞給delete
既然你永遠不會那麼做,你用new創建的每個對象都會「泄漏」。