[英]How to use pointer with objects; Constructors and Destructors. C++
我正在嘗試按特定順序創建和刪除對象的輸出。 默認情況下,首先使用構造函數析構函數創建第一個對象,依此類推,析構函數從最后創建的對象開始刪除。 我正在嘗試更改類似於此的輸出順序:
Object 1 is created, we've got 1 object(s) now!
Object 2 is created, we've got 2 object(s) now!
Object 3 is created, we've got 3 object(s) now!
Object 3 is deleted, we've got 2 object(s) now!
Object 2 is deleted, we've got 1 object(s) now!
Object 4 is created, we've got 2 object(s) now!
Object 4 is deleted, we've got 1 object(s) now!
Object 1 is deleted, we've got 0 object(s) now!
代碼:
class Object {
public:
Object(int i) {
id = i;
count++;
cout<<"Object "<<id<<" is created, we've got "<<count<<" object(s) now!"<<endl;
}
~Object() {
count--;
cout<<"Object "<<id<<" is deleted, we've got "<<count<<" object(s) now!"<<endl;
}
private:
int id;
static int count;
};
為了做到這一點,我發現我可以使用指針,指向創建的對象並在需要時刪除它,這樣我們就可以控制創建和刪除的順序。
#include"Object.h"
extern void TestObjects()
{
Object *a;
Object obj1(1),obj2(2),obj3(3);
a = &obj3;
delete a;
Object *c;
c = &obj2;
delete c;
}
到目前為止,它只創建了 3 個對象,並在創建后立即刪除了第三個對象,我試圖在刪除第三個對象后立即刪除第二個對象。
您使用delete
無效,導致未定義行為,因為您沒有使用new
創建對象。 您正在嘗試銷毀堆棧中存在的對象,並且當它們超出范圍時會自動銷毀,您無權手動銷毀它們。
如果你想使用delete
來控制銷毀順序,你必須使用new
,像這樣:
void TestObjects()
{
Object *obj1 = new Object(1);
Object *obj2 = new Object(2);
Object *obj3 = new Object(3);
delete obj3;
delete obj2;
Object *obj4 = new Object(4);
delete obj4;
delete obj1;
}
或者,在您的特定示例中,只需更多地控制對象的范圍並且根本不使用new
和delete
,就可以獲得相同的輸出:
void TestObjects()
{
Object obj1(1);
{
Object obj2(2);
Object obj3(3);
} // <-- obj3 and obj2 are destroyed here, in that order!
Object obj4(4);
} // <-- obj4 and obj1 are destroyed here, in that order!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.