2014-02-18 8 views
2

我有以下代碼(我將跳過包括和你有什麼):如果我聲明一個沒有名字的類實例,它會留在內存中嗎?

的main.cpp

std::vector <actor> actors; 
int main() { 
    actor (2, 3); 
} 

actor.h

class actor 
{ 
public: 
    int x, y; 
    actor(int, int); 
}; 

actor.cpp

extern std::vector <actor> actors; 
actor::actor(int x, int y) 
{ 
    actor::x = x; 
    actor::y = y; 
    actors.push_back(*this); 
} 

請問線路:

actor (2, 3) 

實際上創建一個演員的實例除了被推送到演員向量?

注意:如果代碼不能編譯,請忽略任何錯誤。實際的代碼確實會編譯,但是太複雜,實際上不能粘貼到這裏。

+1

回覆您的評論:這是您的工作,以製作一個最低限度的例子,在這裏仔細展示問題。如果實際代碼過於複雜,請將其修剪下來,或者構建一個可編譯的最小示例。這實際上是一個非常好寫的問題。 –

回答

5

請問線:

actor (2, 3) 

實際上是從一個除了創造一個演員的一個實例被推向演員矢量?

是的。 actor(2, 3)將創建一個臨時類型爲actor的對象,除非它是未評估的表達式的一部分。在這個臨時的構造函數中,一個(*this)的副本將被壓入堆棧(但是再次注意,在未經評估的表達式中,構造函數當然不會被調用)。

在包含actor(2, 3)的表達式結尾處,臨時將被銷燬。矢量副本將保持不變。


一個未計算的表達式是一個sizeof(…)typeid(…)decltype(…)noexcept(…)表達式內的表達式。

+0

目前還不清楚。 OP的代碼不會編譯,如果表達式是sizeof(actor(2,3))',則不會發生推送。 –

+0

沒有人提到'sizeof',OP只詢問特定行'actor(2,3);' –

+0

@FilipeGonçalves:OP的代碼不能編譯。 –

4

它在表達式評估期間保持「活着」,它是它的一部分並自動處理。

例子:

actor(2,3); // created and immediately destroyed 
actor(2,3)->act(); // created, then acts, then destroyed 
std::cout << actor(2,3) << std::endl; // created, streamed, destroyed 

疑難雜症(從來沒有做到這一點)

actor const& shoot_myself(actor const& a) { return a; } 
... 
actor const& a = shoot_myself(actor(2,)); 
a->act(); // "segmentation fault/core dumped" 
+1

「甚至在std :: endl流式傳輸之前」 - 呃。你確定嗎?我的印象(事實上,我仍然是!),這是錯誤的。子表達式的評估順序完全沒有定義。 (編輯:[是的,這是錯誤的](http://coliru.stacked-crooked.com/a/5836569ef816c29c)) –

+0

@KonradRudolph - 正確,雖然在我的例子中子表達式的順序顯然是從左到右,已經更新了答案 – bobah

2

你忘了放一個分號在聲明的結尾

actor (2, 3) 

必須有

actor(2, 3); 

在此行中創建的臨時對象將在同一直線上時,控制被刪除將傳遞給下一個聲明。它的副本(對象的副本)將由構造函數在向量中推送。

因此,您將只有一個在該向量中的actor類型的對象。

如果要定義由此對象初始化的常量引用,則可以保留該臨時對象。例如

const actor &ar = actor(2, 3); 

在這種情況下你有類型演員一個將在所述載體和將由const引用被refered到此臨時物體按壓的兩個對象。

下面是一個演示所述內容的示例。

#include <iostream> 
#include <vector> 


struct A 
{ 
    int x, y; 
    A (int, int); 
}; 

std::vector<A> v; 

A::A(int x, int y) : x(x), y(y) 
{ 
    v.push_back(*this); 
} 

int main() 
{ 
    const A &ra = A(2, 3); 

    std::cout << "ra.x = " << ra.x << ", ra.y = " << ra.y << std::endl; 
    std::cout << "v[0].x = " << v[0].x << ", v[0].y = " << v[0].y << std::endl; 

    return 0; 
} 

輸出是

ra.x = 2, ra.y = 3 
v[0].x = 2, v[0].y = 3 

在這個例子中程序輸出兩個不同的對象的值。

相關問題