2012-04-25 83 views
-1

我正在使用boost::ptr_vector,但我相信這也適用於標準std::vector以及。我試圖把對象的指針polymophically成boost::ptr_vector層次是,我有一個EntityObject繼承被用線創建指針的多態性

Object * newObject = new Entity(param1, param2); // then I attempt to add it to the ptr_vector 

,但如果我打破程序(Visual Studio 2010中)看這個指針永遠不會被垃圾重定向,垃圾也會被保留。我單步執行代碼,並進入參數化構造函數,並遵循正確的邏輯步驟。

我不確定發生了什麼問題。是否需要在父項或子項中具有特定的成員函數才能使此多態行爲起作用(當前,所有子項都具有對其類型唯一的參數化構造函數,以及具有多態交互方法的析構函數)。我必須擁有賦值操作符,還是我應該在Object類中擁有構造函數。

這似乎是呼籲運營商new不解決對象,但解決其他問題,但VS2010不會引發錯誤。


編輯:說明應該發生什麼。

通過2D std::vector(矩形/非鋸齒)使用case/switch來確定對象

要產生,並添加創建構建

指針到對象,並分配給新//我步進認爲這是哪裏的問題是發生

然後該指針的基準在Visual梭哈被推到一個管理器部件boost::ptr_vector

io 2010我在線上創建了一箇中斷來創建指針,並分配新的(多態),並且在push_back()boost::ptr_vector之間的線上注視着指針。 temp指針的值被創建,並且進入構造函數,它遵循構造函數的所有邏輯步驟,當構造函數完成時,並且棧返回到調用構造函數的那一行,指針仍然是相同的值(我認爲這是可接受的),但是當我查看它指向的所有值顯示爲問號(包括靜態組成的對象)的對象時。那麼當回推觸發,並進入升壓頭時,x值顯示相同的信息。

它幾乎看起來像指針正在創建,並且該對象的數據都被創建,但是一旦構造函數完成,它實際上不會將值分配給父類對象,這應該相當簡單polyphophic行爲。

例如關注的標題(真正的頭確實有成員變量,它們的實現是在一個單獨的cpp文件):

class Object{ 
public : 
    virtual void interact(int action, Object& source){} 
    virtual void updateObject(float duration){} 
    virtual ~Object(){} 
    bool operator==(const Object& _other)const; 
    bool operator!=(const Object& _other)const; 
}; 

class Entity : public Object{ 
public: 
    Entity(Vector3 location, Type thisType, SpecialType difficulty=noSpecial); 
    ~Entity(); 
    void interact(int action, Object& source); 
    void updateObject(float duration); 
}; 

編輯:手頭不斷變化的環境,以更好的目標問題,收到一個解決方案

+0

你能告訴我們你是如何填充向量嗎? – Naveen 2012-04-25 16:41:58

+0

@naveen我不認爲它有什麼關係填充矢量,但實際上獲取正在構建的對象,並首先分配給指針 – gardian06 2012-04-25 17:55:01

+3

這可能是一個愚蠢的問題,但以防萬一......您正在調試非優化的調試版本,對嗎?因爲在發佈版本中,編譯器很可能會跳過所有中間副本,並將指針留在某個寄存器中,而不是將其存儲在內存中的任何位置,直到該向量的存儲爲止。調試器_could_通過顯示該寄存器的內容來處理該事件,無論何時您嘗試查看newObject,x等,但它可以通過顯示這些指針的垃圾或拒絕顯示任何內容來輕鬆處理它。 – abarnert 2012-04-27 22:18:38

回答

0

根據你發佈的內容,很難(如果可能的話)確定問題,更不用說它是如何發生的它。

也許最好從實際工作的東西開始,並添加所需的功能,或者至少弄清楚你偏離期望/有效的地方。因此,下面是一個動態創建對象的小示例,將它們放入一個ptr_vector,在每個對象中使用一個虛函數來驗證容器中的內容是預期的,然後讓容器超出範圍(並且在此過程中銷燬它包含的指針引用的對象)。

#include "boost/ptr_container/ptr_vector.hpp" 
#include <iostream> 
#include <string> 
#include <sstream> 

class Object { 
    std::string name; 
public: 
    Object(std::string const &n) : name(n) {} 

    virtual std::ostream &write(std::ostream &os) const { 
     return os << name; 
    } 

    virtual ~Object() { std::cout << "Object being destroyed\n"; } 
}; 

class Entity : public Object { 
    int value; 
public: 
    Entity(int v, std::string name) : Object(name), value(v) {} 

    std::ostream &write(std::ostream &os) const { 
     return os << "Entity: " << value; 
    } 
    ~Entity() { std::cout << "Entity being destroyed\n"; } 
}; 

int main() { 
    boost::ptr_vector<Object> objects; 

    for (int i=0; i<10; i++) { 
     std::stringstream name; 
     name << "object: " << i; 
     if (i & 1) 
      objects.push_back(new Object(name.str())); 
     else 
      objects.push_back(new Entity(i, name.str())); 
    } 

    boost::ptr_vector<Object>::iterator pos; 
    for (pos = objects.begin(); pos != objects.end(); pos++) { 
     pos->write(std::cout); 
     std::cout << "\n"; 
    } 
    return 0; 
} 

至少對我來說,輸出看起來是這樣的:

Entity: 0 
object: 1 
Entity: 2 
object: 3 
Entity: 4 
object: 5 
Entity: 6 
object: 7 
Entity: 8 
object: 9 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 
Entity being destroyed 
Object being destroyed 
Object being destroyed 

對於它的價值,請注意析構函數 - 當一個Object被破壞,只有基析構函數被調用,但是當一個Entity被破壞,首先調用派生的dtor,然後調用基礎dtor(所以我們看到'實體被破壞'和'物體被破壞')。

+0

我正在通過'boost :: prt_vector '調用'ptr_vector'來錯誤地處理它,這使得它們總是等於最後放置的東西,當該指針超出範圍時,對象停止存在,因此垃圾。 – gardian06 2012-05-05 01:17:45

1

該指針值只改變構造函數完成後,這不是問題。這是合乎邏輯的,因爲首先臨時指針被執行並且只有它被分配給你的指針。

+0

但重新分配不會發生,就像構造函數被調用,然後賦值沒有發生 – gardian06 2012-04-25 17:56:07

1

Object * newObject = new Entity(param1, param2); 

後,你將有newObject指向新創建的對象。雖然構造函數是 正在運行,但仍未分配newObject。如果你之後有例如

vec.push_back(newObject); 

可以踏入push_back方法並查看參數是具有 一個虛擬表引用到Entity方法的一個Object。 (你至少有一個虛擬的析構函數, 對吧?)

+0

是的我有一個虛擬析構函數,當我輸入'push_back()'時,'x'顯示相同的垃圾指針值,當我查看指針指向的值時,即使我的'Entity'構造函數賦值,它也顯示出問號,而'new'應該創建一個指針,並將它分配給指針變量吧? – gardian06 2012-04-25 18:54:43