我刚刚写了我的第一个复制构造函数和复制运算符,并且试图将对象实例分配给数组,如下所示:
Agent agent = Agent(navmesh, rb, m_maxPathSize);
Agent tmp = agent; // DEBUG
m_agents[idx] = agent;
由于tmp
是agent
的完美副本(带有新分配的m_path
指针),因此复制构造函数似乎工作正常。但是,当我将agent
分配给m_agents[idx]
时,后者由我期望的默认构造函数(m_path == 0
,m_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; };
答案 0 :(得分:0)
正如@Evg @HolyBlackCat和@ Adrian-Reinstate-Monica在评论中所述,new[]
为其所有成员调用默认构造函数。 Agent tmp = agent
调用复制构造函数,而tmp = agent
将调用赋值运算符(tmp.operator=(agent)
)。我的赋值运算符是错误的,它应该初始化this
(然后返回*this
而不是返回实例。