这是我正在组织的一个类,用于组织我使用malloc / calloc分配的每个内存块,因此我可以在以后轻松处理它们。以下是该类的定义:
#include "memmanager.h"
std::vector<void*> MemoryManager::GarbageCollector(0);
void MemoryManager::AddToGC(void* myThing)
{
if(__DEBUG__MODE__)
MainDebugger.Log("Adding 1 element to GC: %p", "Info", myThing);
MemoryManager::GarbageCollector.push_back(myThing);
return;
}
void MemoryManager::MultiAddToGC(int args, void* myThing, ...)
{
if(args < 1)
return;
#ifdef _DEBUG
MainDebugger.Log("Adding %i element to GC", "Info", args);
#endif
va_list chrstr;
va_start(chrstr, args);
for(int x = 0; x < args; x++)
MemoryManager::GarbageCollector.push_back(va_arg(chrstr, void*));
va_end(chrstr);
return;
}
void MemoryManager::Flush()
{
int lasterror = 0;
#ifdef _DEBUG
MainDebugger.Log("Call to MemoryManager::Flush() with %i items in the GC", "Info", MemoryManager::GarbageCollector.size());
#endif
for(unsigned int x = 0; x < MemoryManager::GarbageCollector.size(); x++)
{
errno = lasterror = 0;
free(GarbageCollector[x]);
lasterror = errno;
if(lasterror > 0)
MainDebugger.Log("MemoryManager::Flush() Error: %s (%i : %p)", "Error", strerror(lasterror), x, GarbageCollector[x]);
}
GarbageCollector.clear();
return;
}
问题似乎与“MultiAddToGC”功能有关。当我在我的主文件中执行此操作时:
MemoryManager::MultiAddToGC(3,tst,mfile,testfile);
MemoryManager::Flush();
如果我处于调试模式(我在VC ++ 2010中这样做),它可以正常工作。但是,如果我更改为Release模式,它会在调用free()函数时(在堆栈被损坏的情况下)在MemoryManager :: Flush()内部给出错误。我可以继续,如果我继续,我会在日志中得到以下内容:
15:12:26 f 00(0 fps)|错误&gt; MemoryManager :: Flush()错误:无效 论证(2:00D44784)
但是,如果我这样做:
MemoryManager::AddToGC(tst);
MemoryManager::AddToGC(mfile);
MemoryManager::AddToGC(testfile);
MemoryManager::Flush();
它在Debug和release中都有效。没有错误。所以我假设错误在MultiAddToGC()中,但我找不到它。以下代码是标题“memmanager.h”:
#ifndef __MEMMANAGER_H__
#define __MEMMANAGER_H__
#include <vector>
#include <malloc.h>
#include <stdarg.h>
#include "..\core.h"
#include "..\DEBUGGER\debugger.h"
extern bool __DEBUG__MODE__;
extern GameDebugger MainDebugger;
class MemoryManager {
public:
static void MemoryManager::AddToGC(void*);
static void MemoryManager::MultiAddToGC(int, void*,...);
static void MemoryManager::Flush();
private:
static std::vector<void*> GarbageCollector;
protected:
};
#endif
任何帮助/提示/建议都很好。
答案 0 :(得分:0)
在va_start(chrstr, args);
中,第二个参数应该是最后一个命名参数,因此myThing
(但您可能想要删除myThing
)。
但我会写
template <typename...Ts>
void MemoryManager::MultiAddToGC(Ts*... myThings)
{
if(sizeof...(myThings) < 1)
return;
#ifdef _DEBUG
MainDebugger.Log("Adding %i elements to GC", "Info", sizeof...(myThings));
#endif
int dummy[] = {(MemoryManager::GarbageCollector.push_back(myThings), 0)...};
(void) dummy; // avoid warning for unused variable
}
或只是
void MemoryManager::MultiAddToGC(const std::initializer_list<void*>& myThings)
{
if(myThings.size() < 1)
return;
#ifdef _DEBUG
MainDebugger.Log("Adding %i elements to GC", "Info", myThings.size());
#endif
MemoryManager::GarbageCollector.insert(MemoryManager::GarbageCollector.begin(),
myThings.begin(), myThings.end());
}