2010-09-09 97 views
72

在C++中實例化使用新與物體之間的差別,是什麼,而不

除了動態存儲器分配,是存在的代碼下面的兩行之間的功能性差異:

Time t (12, 0, 0); //t is a Time object 

Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object 

我假設當然已經定義了一個Time(int,int,int)ctor。我也意識到,在第二種情況下,由於它是在堆上分配的,因此需要刪除它。還有其他的區別嗎?

+7

它並沒有真正算作答案,但是除了已經給出的答案,您可能有興趣知道如果要編寫自己的內存管理(以獲得更好的性能),可以重寫操作符new/delete。 – 2010-09-09 06:04:27

回答

2

我想你已經明白了所有的差異。假設你很清楚通過指針和變量訪問t成員的語法差異(好吧,指針也是一個變量,但我想你明白我的意思)。並且假設您將t傳遞給一個函數時,您知道值的調用和參考調用的區別。而且我想你也明白如果將t賦給另一個變量並通過其他變量進行更改會發生什麼。結果會根據t是否爲指針而不同。

102

線:

Time t (12, 0, 0); 

...分配在本地範圍Time類型的變量,通常堆棧上,當其範圍結束,這將被破壞。

相比之下:

Time* t = new Time(12, 0, 0); 

...通過調用::operator new()Time::operator new()分配存儲器塊,並隨後調用Time::Time()this設置爲存儲器塊內的地址(以及作爲結果返回new),然後存儲在t中。如你所知,這是一般在堆上完成(默認),並要求你在delete它稍後在程序中,而指針t一般存儲在堆棧上。

+5

+1可能導致'operator new()'過載+1 – Anthony 2010-09-09 06:43:14

+5

+1:也會說堆棧分配**應該快於堆分配。 – 2010-09-09 08:17:31

+0

「該內存塊中的地址」 - 該塊中的任何地址或特定位置(如開頭)的任何地址? – Sev 2010-09-09 08:27:06

5

就構造函數而言,這兩種形式在功能上是相同的:它們只會導致在新分配的對象實例上調用構造函數。您似乎已經很好地掌握了分配模式和對象生命週期方面的差異。

1

在將對象分配給堆棧並將其分配給堆的對象之間沒有功能差異。兩者都會調用該對象的構造函數。

順便說一句,我建議你使用boost的shared_ptr的或scoped_ptr的在堆中分配(與scoped_ptr的附加實用性抄襲不可複製三分球約束你)時,這也是功能上等同:

scoped_ptr<Time> t(new Time(12, 0, 0)); 
1

No ..沒有其他區別..

1

你已經知道沒有其他區別。

假設您的代碼正在使用默認運算符new的服務。

22

一個更明顯的區別是訪問t的變量和方法時。

Time t (12, 0, 0); 
t.GetTime(); 

Time* t = new Time(12, 0, 0); 
t->GetTime(); 
-2
void foo (Time t) 
{ 
    t = Time(12, 0, 0); 
} 

void bar (Time* t) 
{ 
    t = new Time(12, 0, 0); 
} 


int main(int argc, char *argv[]) 
{ 
    Time t; 
    foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor. 

    bar(&t);//t is (12,0,0) 
    return 0; 
} 
+0

我認爲你的評論「// t不是(12,0,0),它的值取決於你定義的類型Time的默認構造函數。」適用於它上面的行,即對象t(時間t;)的聲明。 – AamodG 2016-03-08 06:12:44

1
  • 使用新: 調用operator new函數獲取動態存儲器中,然後調用constuctor功能。
  • 不使用新功能: 不會調用操作符的新功能,只是直接調用構造函數。該堆棧將被直接使用,但不能用於malloc。