我有一個奇怪的行爲與對象分配。如果你能解釋爲什麼這項任務能像這樣工作,我將非常感激。這花了我很多時間。 我正在使用Visual Studio Enterprise 2017(所有默認設置)。奇怪的對象分配行爲C++
代碼:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Test
{
public:
Test()
{
cout << "Constructor of " << this << endl;
}
~Test()
{
cout << "Destructor of " << this << endl;
}
};
int main()
{
cout << "Assignment 1" << endl;
auto t = Test();
cout << "Assignment 2" << endl;
t = Test();
int i = 0;
cin >> i;
return 0;
}
輸出(最高CIN):
Assignment 1
Constructor of 006FFC9F
Assignment 2
Constructor of 006FFBC7
Destructor of 006FFBC7
的預期輸出(最高CIN):
Assignment 1
Constructor of 006FFC9F
Assignment 2
Destructor of 006FFC9F
Constructor of 006FFBC7
我想寫一個測試功能,創建我的(模板)類的對象,做一些測試,然後創建一個新對象並做更多的測試。問題在於t在第二次賦值後保存已經被破壞的對象。 我知道我只能使用導致預期行爲的動態分配,但爲什麼這個程序的行爲不同?
非常感謝。 此致敬禮。
PS:結果是相同的,獨立的推出/調試或64/32位編譯的
編輯:更詳細的例如:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Test
{
private:
float* val;
public:
Test()
{
val = new float;
cout << "Constructor of " << this << ", addr. of val: " << val << endl;
}
~Test()
{
cout << "Destructor of " << this << ", addr. of val: " << val << " --> DELETING VAL!" << endl;
delete val;
}
float* getVal() { return this->val; }
};
int main()
{
cout << "Assignment 1" << endl;
auto t = Test();
cout << "Assignment 2" << endl;
t = Test();
cout << "Val Address: " << t.getVal() << endl;
int i = 0;
cin >> i;
return 0;
}
輸出(它保持在一個已刪除的指針結束!!!):
Assignment 1
Constructor of 004FFBDC, addr. of val: 0072AEB0
Assignment 2
Constructor of 004FFB04, addr. of val: 00723928
Destructor of 004FFB04, addr. of val: 00723928 --> DELETING VAL!
Val Address: 00723928
看一看複製橢圓,自C++ 17以來必須在某些情況下執行。 –
'auto t = Test();'不是一個賦值,而是一個初始化。 – Jarod42
在't = Test();'你構造一個Test的臨時對象,把它傳遞給't'的'operator =',然後銷燬這個臨時對象。你爲什麼認爲這是一個問題?如果你把print語句放在'operator ='中(爲了完整起見,也許是copy-constructor),你會清楚地看到這種行爲。 –