2011-11-24 26 views
-3

如果我在我的析構函數中放置斷點,我注意到當我實例化所述對象時,所有代碼都會運行,但行沒有任何影響(如在刪除實際上似乎並沒有刪除該對象)什麼是真的要在這裏?爲什麼我的析構函數代碼在實例化上執行,它在做什麼?

我正在使用visual studio,這是一個程序的神器(這是正確的詞?)?

析構函數被調用:

Brain::~Brain() 
{ 
    for (unsigned int i = 0; i < weapons.size(); i++) 
    { 
     delete weapons[i]; 
    } 
} 

如果我把斷點在這裏,他們的時候,大腦被實例化被觸發!當我關閉程序的時候。

這裏是對象的構造函數:

Brain::Brain(
int health, 
Level& level, 
vector<Agent>& agents, 
//vector<Pickup>& pickups, 
D3DXCOLOR colour, 
Mesh& mesh) 
: Entity(colour, mesh), gunOffset(D3DXVECTOR3(0, 0, 1.0f)), 

level(level), 
agents(agents), 
//pickups(pickups), 
colour(colour), 
health(health), 

enemies(vector<int>()), 
seenEnemies(vector<int>()), 
seenPickups(vector<int>()), 

seenEnemyMarkers(vector<BoundingSphere>()), 
seenPickupMarkers(vector<BoundingSphere>()), 
weapons(vector<Gun*>()), 
RoomKills(vector<int>()), 
pathVisualisation(vector<Edge>()), 
search(vector<int>()), 

WALKING_INCREMENT(0.06f), 
TOLERANCE(0.1f), 
COMBAT_SEARCH_TIME(0), 
SHOTGUN_STOPPING_DISTANCE(1.5f), PISTOL_STOPPING_DISTANCE(5.0f), 
SPAWNTIME(120), 
IMPACT_DISTANCE(0.6f), 
FIELD_OF_VIEW(0.95f), 
MARKER_SIZE(0.5f) 
{ 
currentNodeInSearchPathInt = 0; 
combatSearchCycle = 0; 
spawnCycle = 0; 
globalNodePositionIndex = 0; 
//fightOrFlight = 0; 

chosenTarget = -1; 
previousTarget = -1; 
pickupMemory = -1; 
agentMemory = -1; 



for (unsigned int i = 0; i < level.RoomCentreNodeVectors().size(); i++) 
{ 
    RoomKills.push_back(level.Nodes()[level.RoomCentreNodeVectors()[i][0]].Room()); 
} 

weapons.push_back(new Pistol()); 
weapons.push_back(new Rifle()); 
weapons.push_back(new Shotgun()); 

prevTargetType = AGENT; 
targetType = AGENT; 
currentWeapon = PISTOL; 

state = SPAWN; 
} 

它可能有一些做這件事?

for (int i = 0; i < 2; i++) 
{ 
agents.push_back(Agent(100, *level, agents/*, level->Pickups()*/, D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f), *mesh)); 
} 

代理繼承自Brain。

這是代理:被實例化

的對象
#ifndef AGENT_H 
#define AGENT_H 

#include <d3d10.h> 
#include <d3dx10.h> 
#include "Brain.h" 

class level; 

class Agent : public Brain 
{ 
private: 
    int counter; 
    Level& level; 

int previousState; 

const int 
    TARGET_IS_AGENT, 
    TARGET_IS_OBJECT, 
    TARGET_IS_AGENT_MEMORY, 
    NO_TARGET; 

int fightFlightThreshold; 

const int SHOTGUN_DISTANCE_TOLERANCE; 
public: 
Agent(int health, 
    Level& level, 
    vector<Agent>& agents, 
    D3DXCOLOR colour, 
    Mesh& mesh); 
void UpdateAgent(); 
void DrawAgent(D3DXMATRIX matView, D3DXMATRIX matProjection, bool dataVis); 
void RegenerativeHealth(); 
//int TargetChooser(); 
}; 

#endif 
+1

你是什麼意思,他們沒有影響?他們並沒有被執行? –

+0

嘗試重建項目並再次調試 – Default

+0

您能證明嗎? – jrok

回答

4

析構函數應該該實例中被執行。

但是,它可能是作爲過程的一部分創建臨時對象。這是我能想到的唯一基於代碼正在運行(用於臨時對象)但沒有效果(在被實例化的對象上)的描述的基礎上。

這可能不太難檢查。檢查this指針,當你坐在析構函數的斷點處,然後在實例化之後將它與對象指針進行比較。

如果他們是一樣的,我會驚訝。

+0

大腦或武器的指針? – SirYakalot

+0

大腦指針,假設這是被實例化的東西,並且你聲明析構函數被調用。 – paxdiablo

+0

不幸的是,我無法將它與實例化後的對象進行比較,因爲代碼在此處中斷。 – SirYakalot

0

也許你的編譯二進制文件沒有及時更新你的源代碼,並且調試器顯示錯誤的行被執行。這在Visual Studio中有時會發生。

+0

我該如何解決這個問題? – SirYakalot

+0

重建項目並重新調試。 – FeatureShock

+0

不幸的是沒有效果 – SirYakalot

0

如果您在析構函數中放置斷點,然後查看調用堆棧,您將看到導致析構函數運行的行。幾乎肯定有一些複製正在進行,臨時正在被破壞,這讓你感到困惑。

0

在發佈模式下調試有時很棘手。默認優化可能會優化某些代碼,因此您在Dev studio中進入的內容可能與實際執行的內容不匹配。

0

這可能是因爲你是Debugging optimized code

當編譯器優化的代碼,它重新定位和重組 指令,導致更有效的編譯代碼。由於 這種重新排列,調試器不能始終識別與一組指令對應的源代碼。

優化可以影響:

  • 局部變量,可以通過優化來去除或轉移到 位置調試器不明白。

  • 函數內的位置,當優化程序 合併代碼塊時更改。

  • 調用堆棧上的幀的函數名稱,如果 優化程序合併了兩個函數,則這可能是錯誤的。

所以它可能是調試器顯示,它認爲是下一條指令的指令,但實際上是不

+0

它仍然發生在調試中 – SirYakalot

相關問題