C++ 这些功能有什么问题?

C++ What's wrong with these functions?

本文关键字:什么 问题 功能 C++      更新时间:2023-10-16

这是我正在做的一个类,用于组织我使用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中这样做)。但是,如果我更改到释放模式,它会在调用free()函数时在MemoryManager::Flush()中给我一个错误(关于堆栈被损坏的一些东西)。我可以继续,如果我继续,我在日志中得到以下内容:

15:12:26 f 00 (0 fps) | Error> MemoryManager::Flush() Error: Invalid参数(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 "..DEBUGGERdebugger.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

欢迎任何帮助/提示/建议

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());
}