我无法将对象分配给对象数组

问题描述 投票:0回答:1

我刚刚写了我的第一个复制构造函数和复制运算符,我正试图将对象实例分配给数组,如下所示:

Agent agent = Agent(navmesh, rb, m_maxPathSize);
Agent tmp = agent; // DEBUG
m_agents[idx] = agent;

复制构造函数似乎运行良好,因为tmpagent的完美副本(具有新分配的m_path指针)。但是,当我将agent分配给m_agents[idx]时,后者由我期望的默认构造函数(m_path == 0m_alive == false)组成。

我的构造函数看起来像这样:

Agent() { m_path = 0; m_alive = false; };
Agent::Agent(NavMeshNavigator* navmesh, RigidBody* rb, int maxPathSize)
    : m_rb(rb), m_navmesh(navmesh), m_maxPathCount(maxPathSize)
{
    m_path = new float3[maxPathSize];
};
Agent::Agent(const Agent &a)
{
    memcpy(this, &a, sizeof(Agent));
    if (m_path)
    {
        float3* oldptr = m_path;
        m_path = new float3[m_maxPathCount];
        memcpy(m_path, oldptr, m_maxPathCount * sizeof(float3));
    }
}
Agent& Agent::operator=(const Agent &a) { return Agent(a); }
Agent::~Agent() { if (m_path) delete[] m_path; };

...

protected:
   float3* m_path;
   bool m_alive = true;

[构造函数使用m_path分配new[]的内存,析构函数使用delete[]释放它的内存,复制运算符调用复制构造函数,并且复制构造函数首先在分配新的m_path数组之前复制原始副本。] >

在我的测试案例中,为idx == 0,所以不能这样。我最初使用malloc而不是new[],但是得到了相同的结果。我会说问题出在我的复制构造函数/运算符中,因为我对此没有经验,但是为什么它在tmp上能正常工作?

编辑:m_agents数组是这样声明和销毁的:

NavMeshAgents(int maxAgents, int maxAgentPathSize)
        : m_maxAgents(maxAgents), m_maxPathSize(maxAgentPathSize)
    {
        m_agents = new Agent[maxAgents];
    };
    ~NavMeshAgents() { if (m_agents) delete[] m_agents; m_agents = 0; };

我刚刚写了我的第一个复制构造函数和复制运算符,我正在尝试将对象实例分配给数组,如下所示:Agent agent = Agent(navmesh,rb,m_maxPathSize);代理tmp =代理; // DEBUG ...

c++ memory copy-constructor
1个回答
0
投票

正如@Evg @HolyBlackCat和@ Adrian-Reinstate-Monica在评论中所述,new[]为其所有成员调用默认构造函数。 Agent tmp = agent调用复制构造函数,而tmp = agent将调用赋值运算符(tmp.operator=(agent))。我的赋值运算符是错误的,它应该初始化this(然后返回*this而不是返回实例。)>

© www.soinside.com 2019 - 2024. All rights reserved.