mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-08 17:48:46 -10:00
Report leaks after static destruction via _CRTDBG_LEAK_CHECK_DF instead of calling _CrtDumpMemoryLeaks() at the end of main(), which incorrectly reported every global container as a memory leak. Also fix the three remaining real leaks which were discovered after all the noise was cleared up: - Mc_point_list was never freed, because its atexit cleanup was only registered by code that no longer runs. But the list was only a temporary array of pointers used while building the collision tree, so remove it and have model_collide_parse_bsp_defpoints() copy the vertices directly into the tree's point list. - model_batch_buffer's Mem_alloc copy was never freed. But the copy is actually not necessary, so remove it and pass Submodel_matrices directly. - Goal_target_names strings were only freed when the next mission was parsed, so the last mission's names leaked at exit. Hold them in SCP_vm_unique_ptr so they are freed with the vector. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
/*
|
|
* Copyright (C) Volition, Inc. 1999. All rights reserved.
|
|
*
|
|
* All source code herein is the property of Volition, Inc. You may not sell
|
|
* or otherwise commercially exploit the source or things you created based on the
|
|
* source.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* The code in here is just for bookeeping, allocating AI slots and linking them to ships.
|
|
* See AiCode.cpp for the actual AI code.
|
|
*/
|
|
|
|
#include "ai/ai.h"
|
|
#include "object/object.h"
|
|
#include "ship/ship.h"
|
|
#include "utils/string_utils.h"
|
|
|
|
|
|
// heap-allocated rather than SCP_string, so that the pointers held by ai goals stay valid when the vector grows
|
|
SCP_vector<SCP_vm_unique_ptr<char>> Goal_target_names;
|
|
ai_info Ai_info[MAX_AI_INFO];
|
|
ai_info *Player_ai;
|
|
|
|
/**
|
|
* @brief Returns index of free AI slot.
|
|
* @return Return -1 if no free slot.
|
|
*/
|
|
int ai_get_slot(int shipnum)
|
|
{
|
|
int i;
|
|
|
|
for (i=0; i<MAX_AI_INFO ; i++)
|
|
if (Ai_info[i].shipnum == -1) {
|
|
Ai_info[i].shipnum = shipnum;
|
|
return i;
|
|
}
|
|
|
|
Error( LOCATION, "Couldn't get AI slot, please tell a coder!");
|
|
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* @brief Frees a currently used AI slot.
|
|
* @details Only modifies in ::Ai_info struct. Does not modify hook in ship.
|
|
*/
|
|
void ai_free_slot(int ai_index)
|
|
{
|
|
Assert( (ai_index >= 0) && (ai_index < MAX_AI_INFO) );
|
|
|
|
Ai_info[ai_index].shipnum = -1;
|
|
}
|
|
|
|
const char *ai_get_goal_target_name(const char *name, int *index)
|
|
{
|
|
Assertion(name != nullptr && index != nullptr, "Arguments cannot be null!");
|
|
|
|
for (int i = 0; i < static_cast<int>(Goal_target_names.size()); ++i) {
|
|
if (!stricmp(name, Goal_target_names[i].get())) {
|
|
*index = i;
|
|
return Goal_target_names[i].get();
|
|
}
|
|
}
|
|
|
|
*index = static_cast<int>(Goal_target_names.size());
|
|
Goal_target_names.push_back(util::vm_unique_copy(name, false));
|
|
return Goal_target_names.back().get();
|
|
}
|