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

C++ 为什么我的析构函数代码在实例化时执行?它到底在做什么?,c++,C++,如果我在析构函数中放置断点,我会注意到当我实例化所述对象时,所有代码都会运行,但行没有任何效果,如中所示,删除实际上似乎不会删除该对象。这里到底发生了什么 我使用的是VisualStudio,这是一个人工制品吗?节目的内容 正在调用析构函数: Brain::~Brain() { for (unsigned int i = 0; i < weapons.size(); i++) { delete weapons[i]; } } 如果我把断点放在这里

如果我在析构函数中放置断点,我会注意到当我实例化所述对象时,所有代码都会运行,但行没有任何效果,如中所示,删除实际上似乎不会删除该对象。这里到底发生了什么

我使用的是VisualStudio,这是一个人工制品吗?节目的内容

正在调用析构函数:

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));
}
代理从大脑中继承

我是代理:

#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

在实例化过程中,不应执行正在实例化的对象的析构函数

但是,临时对象可能是作为过程的一部分创建的。根据您的描述,这是我能想到的唯一有意义的事情,即代码正在为临时对象运行,但对正在实例化的对象没有影响

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


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

可能您编译的二进制文件与源代码不符,并且调试器显示了要执行的错误行。在VisualStudio中有时会发生这种情况

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

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

可能是您正在执行

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

优化可能会影响:

局部变量,可由优化器删除或移动到 调试器无法理解的位置

函数中的位置,当优化器 合并代码块

调用堆栈上帧的函数名,如果 优化器合并了两个函数


因此,调试器可能会显示它认为是下一条指令的指令,但实际上不是

什么意思,它们没有效果?它们实际上没有被执行?试着重新构建您的项目并进行调试。我不理解您的问题。当实例被删除或超出范围而被销毁时,将执行析构函数。好的做法是使用小型析构函数,只释放资源……如果您在VisualStudio中运行,您是在调试模式还是释放模式下运行它?有时,在发布模式下,指令指针会跳一跳,向我们展示实例化代码,包括构造函数和对象的创建。通过重新构建项目并再次调试。哪个对象拥有Brain对象?它是如何分配给目标对象的?这有点可疑:levellevel、agentsagents、//pickupspickups、colorColor、healthhealth,您的成员变量与构造函数参数同名。代理成员变量是如何定义的?Brain指针,假设这是正在实例化的对象,并且您声明析构函数正在被调用。不幸的是,我无法将其与实例化后的对象进行比较,因为代码在这一点上中断。中断为断点?然后只需将其记录在析构函数中,然后单步或单步执行,直到实例化完成。然后比较这些值。@SirYakalot如果您遇到运行时错误,我强烈建议您开始一次注释一行代码,并尝试找出导致访问冲突的指令warning@Default它发生在写着删除武器[i]当我关闭程序时(如果用于启动代理的循环设置为“循环一次”),或者在程序开始时(如果我正在实例化多个代理)。