例如我有類與構造具有整數的數組作爲參數:陣列中類構造
A(int* array) : m_array(array) {}
我可以使用這樣的:
int array[] = { ... }
A a(array);
或者是這樣的:
int* array = new int[10];
A a(array);
如果對象然後使用它的數組,它必須(或可能不是?)刪除它在desctructor(如果它是動態的)。但他怎麼會知道,這個數組的內存是動態分配的?
例如我有類與構造具有整數的數組作爲參數:陣列中類構造
A(int* array) : m_array(array) {}
我可以使用這樣的:
int array[] = { ... }
A a(array);
或者是這樣的:
int* array = new int[10];
A a(array);
如果對象然後使用它的數組,它必須(或可能不是?)刪除它在desctructor(如果它是動態的)。但他怎麼會知道,這個數組的內存是動態分配的?
你不知道它是否是動態分配的,因爲畢竟int* array
是一個int
指針,而不是一個數組。你還不如傳:
int i;
A a(&i);
正如你可以想像,如果你試圖delete[]
一個,或者嘗試用N訪問m_array[N]
不好的事情會發生> 0
所以,你必須依靠來電者做正確的事情;你無法做任何事情來驗證或執行它。你所有的是一個int
的地址。誰創造了這個int
,或者更多的int
在它之後如何或是否會跟隨,將是未知的。
如果您想要更安全,請使用std::vector
。這是它的目的。
您正在初始化構造函數中的數組,因此它將始終被初始化。它是在代碼中預先定義的,它將被分配。如果有其他構造函數不分配數組,則需要執行此檢查。
順便說一下,這是假設您分配的數組是該類的成員。如果您將其分配給構造函數中的新堆棧變量,則無法在析構函數中將其刪除。
你不知道它是什麼,因爲一個靜態數組也會衰減到一個指針。
基本上你只需要傳遞給構造函數的數組的值。你不需要知道它是一個動態分配還是靜態分配的數組。重要的是數據成員數組,它是您類的接口的一部分,並將數據複製到其中。作爲參數傳遞給構造函數的數組的責任應該由調用者根據其刪除和生命週期來決定。
如果您使用std::vector
而不是原始數組,它會讓您的生活更輕鬆。
從我理解你試圖問的是析構函數是否將釋放你分配給數組的內存。
不,您使用new分配的內存必須由您在析構函數中或其他位置刪除,因爲您的內存分配不在構造函數內部,而是在外部。
你的問題不清楚 – asheeshr
AFIK你需要在你的代碼中手工處理。沒有自動檢測的方法。也許你可以用它的內存地址來檢查它,但ALSR會阻止它。 – rekire
這就是爲什麼人們應該首先努力避免使用C數組的最佳例子。使用'std :: vector <>'或'std :: array <>',問題就變得沒有意義了。 – ildjarn