Я только что написал свой первый конструктор копирования и оператор копирования, и я пытаюсь присвоить экземпляр объекта массиву следующим образом:
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
array.
В моем тестовом примере 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; };