为什么我的析构函数代码在实例化时执行,它到底在做什么?

时间:2011-11-24 12:19:53

标签: c++

如果我在析构函数中放置断点,我注意到当我实例化所述对象时所有代码都会运行,但这些行没有任何效果(如同,删除实际上似乎没有删除对象)真的要在这里吗?

我正在使用visual studio,这是一个神器(是正确的词吗?)?

调用析构函数:

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

如果我在这里放置断点,它们会在Brain被实例化时被触发!当我关闭程序时再次。

这里是对象构造函数:

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

5 个答案:

答案 0 :(得分:4)

实例化对象的析构函数应该在实例化期间 执行。

但是,可能是因为temorary对象是作为流程的一部分创建的。这是我唯一可以想到的,根据您的描述,代码正在运行(对于临时对象)但没有效果(对正在实例化的对象)。

这可能不太难检查。当你坐在析构函数中的断点处时检查this指针,然后在实例化后将其与对象指针进行比较。

如果它们是相同的,我会非常感到惊讶。

答案 1 :(得分:0)

也许你的编译二进制文件不是最新的源代码,而调试器显示错误的行要执行。有时在Visual Studio中会发生这种情况。

答案 2 :(得分:0)

如果在析构函数中放置断点然后查看调用堆栈,您将看到导致析构函数运行的行。几乎可以肯定有一些复制正在进行,一个临时的被破坏,这让你感到困惑。

答案 3 :(得分:0)

在发布模式下调试有时很棘手。默认优化可以优化一些代码,因此您在Dev studio中进行的操作可能与实际执行的内容不匹配。

答案 4 :(得分:0)

可能是你Debugging optimized code

  

当编译器优化代码时,它会重新定位和重新组织   指令,从而产生更高效的编译代码。因为   这种重新排列,调试器无法始终识别源   与一组指令相对应的代码。

     

优化可能会影响:

     
      
  • 本地变量,可以由优化程序删除或移动到   调试器不理解的位置。

  •   
  • 函数内的位置,在优化器中更改   合并代码块。

  •   
  • 调用堆栈上帧的函数名称,如果是,则可能是错误的   优化器合并了两个函数。

  •   

所以可能是调试器显示认为是下一条指令的指令,但实际上不是