Я знаю, что есть еще несколько вопросов по этому конкретному вопросу, но ничего, что я могу найти на нем, похоже, работает, поэтому я отправляю свой код ,Ошибка: переменная '*' имеет инициализатор, но неполный тип и еще один
Вот код:
#ifndef __MEMORY_TRACKER_H__
#define __MEMORY_TRACKER_H__
#include <unordered_map>
namespace cige
{
namespace memory
{
class CIGE_API MemoryTracker
{
protected:
typedef struct AllocRecord
{
size_t bytes;
std::string filename;
size_t line;
std::string func;
AllocRecord() :
bytes(0), line(0)
{ }
AllocRecord(size_t sz, const char* file, size_t ln, const char* fun) :
bytes(sz), line(ln)
{
if (file)
filename = file;
if (fun)
func = fun;
}
} AllocRecord;
std::string m_leakFileName;
bool m_dumpToConsole;
typedef std::unordered_map<void*, AllocRecord> AllocMap;
AllocMap m_allocationMap;
size_t m_totalAllocations;
bool m_recordEnable;
protected:
void reportLeaks();
MemoryTracker() :
m_leakFileName("CIGEMemory.log"), m_dumpToConsole(true), m_totalAllocations(0), m_recordEnable(true)
{ }
public:
void setReportFileName(const std::string& name)
{
m_leakFileName = name;
}
const std::string& getReportFileName() const
{
return m_leakFileName;
}
void setReportToConsoleOutput(bool b)
{
m_dumpToConsole = b;
}
bool getReportToConsoleOutput() const
{
return m_dumpToConsole;
}
void setRecordEnable(bool b)
{
m_recordEnable = b;
}
bool getRecordEnable() const
{
return m_recordEnable;
}
size_t getTotalMemoryAllocated() const
{
return m_totalAllocations;
}
void _recordAlloc(void* ptr, size_t sz, const char* file = nullptr, size_t ln = 0, const char* fun = nullptr);
void _recordDealloc(void* ptr);
~MemoryTracker()
{
reportLeaks();
}
static MemoryTracker& get();
};
}
}
#endif // __MEMORY_TRACKER_H__
Я получаю: variable 'cige::memory::CIGE_API cige::memory::MemoryTracker' has initializer but incomplete type
в соответствии с объявлением класса. Я просмотрел все, и я не могу найти ответы, которые исправили эту проблему.
У меня также есть ошибка expected '}' or ',' or ';' before 'protected'
на линии с защитой, прямо над структурой.
Любая помощь с любой из этих двух ошибок будет оценена по достоинству.
EDIT: CIGE_API определен в отдельном файле (который включен), как __declspec(dllexport)
.
EDIT2: Я исправил свою проблему (см. Ответ ниже). В основном это был код Code :: Blocks, который был довольно плохим.
Боковое замечание: ваши идентификаторы защитника включены в C++, поскольку имена, начинающиеся с подчеркивания, или одно подчеркивание, за которым следует заглавная буква, зарезервированы для исполнителей библиотеки компилятора/стандартной библиотеки. Кроме того, 'typedef struct' не имеет смысла в C++. И в-третьих, как определяется CIGE_API? Согласно сообщению об ошибке, его определение, вероятно, отсутствует. –
Я использую Code :: Blocks, и я включил отдельный файл с набором стандартов, используя параметр C :: B, чтобы глобально включать файлы. CIGE_API определяется как __declspec (dllexport). – sm81095
Кроме того, @KonradRudolph, те, которые включают в себя охранники, абсолютно верны, так как у меня никогда не было проблем с ними раньше, во многих проектах, которые я использовал как с MSVC, так и с MinGW. Его также то же самое касается охранников, которые использует Ogre Engine, и у них, похоже, никогда не было никаких проблем с ним. – sm81095