在C++中,調用new
的指針是否包含new
'd數據刪除舊數據?C + +構造函數/析構函數調用&動態創建的數據調用「新」刪除舊數據?
我想說它沒有,而且會導致泄漏。在已經包含數據的指針上調用new肯定會將指針指向新數據,並且我們將失去對舊數據的引用?
我問,因爲我是看着this page,我注意到在車隊已經提出,OP做到這一點:
MyString::MyString()
{
// A new, empty string contains zero characters plus a terminating zero.
nlength = 1;
nstring = new char[1];
nstring[0] = '\0';
}
MyString::MyString(const char *input)
{
// A new, copy of a C-string contains exactly the same number of characters in
// the C-string plus a terminating zero.
nlength = strlen(input) + 1;
nstring = new char[ nlength ];
strcpy(nstring, input);
}
MyString::MyString(const MyString& S)
{
nlength = S.nlength; // we know this is correct!
nstring = new char[ nlength ];
strcpy(nstring, S.nstring);
}
//nstring is deleted in the destructor
MyString::~MyString()
{
delete[] nstring;
}
這似乎很奇怪,我。因爲,如果nstring
已經被定義,那麼它會泄漏?沒有?
但是,這些都是構造函數,所以我猜這裏的邏輯是它們只會在每個實例中調用一次。這就說得通了。然而,會發生什麼,如果我做了以下內容:
MyString myString("test");
myString = MyString("test2"); //is the destructor invoked here?
如果析構函數被重新分配時調用的myString然後這一切對我來說很有意義。
因此,在總結,兩件事情我想證實:
- 如果分配
new
數據已經有new
數據的指針,那麼這會泄漏,是否正確? - 重新分配對象時,對象的析構函數是否被調用?
1)正確。它會泄漏。 2)在上面的例子中,你問的是被調用的析構函數,答案是肯定的。但你真的應該自己測試一下。創建一個簡單的控制檯應用程序非常簡單,在構造函數/析構函數中使用cout/printf,並使用賦值和複製構造函數來查看實際的功能。 – zumalifeguard
@zumalifeguard ack,我一直在測試各種各樣的東西,出於某種原因,我沒有想到要真正測試析構函數。我現在會這樣做。謝謝你指出。 – Jace
我認爲對「這裏調用的析構函數」的洞察力是「是的 - 但可能不是你想的那個」等號的析構函數右側的MyString運行。等號左側的myString調用其賦值運算符。 –