Ich habe eine Klasse, die von Std :: streambuf abgeleitet ist. Ich kann nicht verstehen, warum oder wo es ausläuft; entsprechend dem Werkzeug, das ich benutze, ist der letzte Punkt in meinem Code, bevor es aussieht, irgendwo in dieser Klasse (aber es kann Zeilennummer nicht extrahieren)Speicherleck in meiner benutzerdefinierten Streambuf-Klasse
Die Idee ist, dass die Klasse eine beliebige Anzahl von Streambufs halten kann, was es wird Daten in synchronisieren. (Zum Beispiel std :: cout und a ofstream.rdbuf) Ich speichere meine Daten in einer Zeichenkette, bis ich die std :: endl bekomme, in die ich alle streambufs schreibe
Kann mir jemand zeigen, wo es könnte Leckspeicher?
Das ist mein Kopf:
#ifndef _MY_STREAM_BUF_H
#define _MY_STREAM_BUF_H
#include <iostream>
#include <algorithm>
#include <list>
#include "../../../Interface/EngineDefs.h"
namespace MyEngine
{
class MyStreamBuf : public std::streambuf
{
public:
MyStreamBuf();
~MyStreamBuf();
void AddStream(std::streambuf* sb);
void RemoveStream(std::streambuf* sb);
bool IsStreamAdded(std::streambuf* sb);
private:
std::list<std::streambuf*> mStreamBufs;
std::string mLine;
int32_t overflow(int32_t c);
int32_t sync();
};
}
#endif
CPP-Datei:
#include "../../../Include/Core/Logging/MyStreamBuf.h"
namespace MyEngine
{
MyStreamBuf::MyStreamBuf() : std::streambuf()
{
}
MyStreamBuf::~MyStreamBuf()
{
mStreamBufs.clear();
mLine.clear();
}
void MyStreamBuf::AddStream(std::streambuf* sb)
{
if (sb)
mStreamBufs.push_back(sb);
}
void MyStreamBuf::RemoveStream(std::streambuf* sb)
{
if (sb)
mStreamBufs.remove(sb);
}
bool MyStreamBuf::IsStreamAdded(std::streambuf* sb)
{
if (sb)
return (std::find(mStreamBufs.begin(),mStreamBufs.end(),sb) != mStreamBufs.end());
else
return false;
}
int32_t MyStreamBuf::overflow(int32_t c)
{
int32_t r1 = 0, r2 = 0;
if (c == EOF)
return !EOF;
else
{
mLine += c;
return r1 == EOF || r2 == EOF ? EOF : c;
}
}
int32_t MyStreamBuf::sync()
{
int32_t res = 0;
for(std::list<std::streambuf*>::iterator it = mStreamBufs.begin(); it != mStreamBufs.end(); ++it)
{
if (*it)
{
(*it)->sputn(mLine.c_str(),mLine.length());
res &= (*it)->pubsync();
}
}
mLine.clear();
return res == 0 ? 0 : -1;
}
}
wird Ihr streamBuf * dynamisch zugewiesen? Ich sehe einen Aufruf zum Entfernen(), führt dies eine Löschung durch? – EdChum
meinst du mStreambuf-Mitglied oder MyStreamBuf-Klasse? Die hinzugefügten streambufs sind zum Beispiel std :: cout.rdbuf oder ein ofstream.rdbuf (was ich schließe und lösche) – KaiserJohaan
Ich meine was auch immer in 'void MyStreamBug :: RemoveStream (std :: streambuf * sb) 'ist sb dynamisch zugeordnet? Wenn ja, dann sollten Sie es löschen, da remove nur den Eintrag entfernt und nicht die richtige Sache tut, da Sie Zeiger speichern, sonst ist es besser, einen Container zu haben, der 'shared_ptr' anstelle von rohen Zeigern –
EdChum