Autor Thema: C++-Task ist speicherhungig  (Gelesen 2443 mal)

Offline inu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 594
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
C++-Task ist speicherhungig
« am: 28.08.06 - 11:37:39 »
Hallo Leute,

habe einen Task mittels API (C++) geschrieben, der periodisch Aktivitäten ausführt. Mit jedem Ausführen sehe ich im Task-Manager von Windows, dass mehr und mehr Speicher genutzt/benötigt wird.
Habt ihr so etwas auch festgestellt? Wie kann man das ändern. Zumal die noteseigenen Task beträchtlich weniger an Hauptspeicher benötigen, als mein kleiner Testtask.

Vielen Dank

Offline 0xse

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 507
  • Geschlecht: Männlich
Re: C++-Task ist speicherhungig
« Antwort #1 am: 28.08.06 - 11:41:49 »
C++ hat keinen Garbage Collector. Gibst du den verwendeten Speicher auch immer wieder ordentlich frei? :)

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: C++-Task ist speicherhungig
« Antwort #2 am: 28.08.06 - 11:44:45 »
Du dürftest einen Memory Leak programmiert haben.
Ich bin nicht so der C-Programmierer. Aber das hört sich extrem so an.
Vermutlich gibts da irgendwelche Analysetools zu.
Wenn man mit C arbeitet, muß man sich eben mit Speicher-Allokation beschäftigen.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline inu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 594
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: C++-Task ist speicherhungig
« Antwort #3 am: 28.08.06 - 11:46:58 »
@Oxse: So viele Möglichkeiten bietet doch die API nicht.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: C++-Task ist speicherhungig
« Antwort #4 am: 28.08.06 - 11:52:12 »
machst du irgendwelche NSFSearch Operationen ?

Wenn ja, kannst du mal die relevante Stelle im Code posten ?
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline 0xse

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 507
  • Geschlecht: Männlich
Re: C++-Task ist speicherhungig
« Antwort #5 am: 28.08.06 - 11:54:12 »
Die API, mag sein, aber C++ ^^ Triviales Beispiel:

void *p = NULL;

p  = new cIrgendwas;

[...code...]

p  = new cIrgendwasAnderes;

Und schon hast du ein cIrgendwas Objekt im Speicher rumfliegen. Vergesse nie das delete :)

Ansonsten, hier kannste deinen Code posten. Dann kann ich dir vlt sagen wo der Fehler ist :)

http://mandrill.fuxx0r.net/c++/paste

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: C++-Task ist speicherhungig
« Antwort #6 am: 28.08.06 - 11:58:37 »
Selbst sowas triviales wie ein delete sollte auch die API bieten. Sonst wäre sie Unbrauchbar!


P.S. gibt es an der Stelle auch Konstruktoren und Destruktoren?

André
« Letzte Änderung: 28.08.06 - 12:01:08 von DerAndre »
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

Offline inu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 594
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: C++-Task ist speicherhungig
« Antwort #7 am: 28.08.06 - 14:47:00 »
@eknori, @Oxse:

Code
int main(int argc, char *argv[])
{	LNNotesSession		Session;
	LNServerAddin		Addin;
	LNDatabaseArray		DBArray;
	LNDatabase			Database;
	LNAgentArray		AgentArray;
	LNAgent				Agent;
	LNString			Ausgabe, buffer, taskname, Name;
	int					AgentCount;
	LNMessageQueue		mqueue;
	int					ProgramStatus = 0;
	int a,b;
	LNSetThrowAllErrors(TRUE);
	try
	{	Session.Init(argc, argv);
		Session.GetServerAddin("MyTask","MyTask", &Addin);
		Addin.AppendLogMessage("MyTask gestartet");
		taskname = Addin.GetDefaultStatusLineTaskName();
		buffer = TASK_QUEUE_PREFIX;
		buffer.Append(taskname);
		Session.CreateMessageQueue( buffer, &mqueue);
		while (!Addin.Idle())
		{	if (Addin.HaveSecondsElapsed(600) )
			{	try
				{	Session.GetDatabases( &DBArray, "", "", LNGETDBFLAGS_DATABASES + /*LNGETDBFLAGS_TEMPLATES +*/ LNGETDBFLAGS_RECURSE);
					Ausgabe =	"MyTask: ";
					Ausgabe	+=	LNString(DBArray.GetCount());
					Ausgabe += (" Datenbanken gefunden");
					Addin.AppendLogMessage(Ausgabe);
					AgentCount = 0;				
					// alle DBs auslesen		
					for (a=0;a<int(DBArray.GetCount());a++)
					{	Database	= DBArray.operator[]( a );
						Database.Open();
						Database.GetAgents( &AgentArray, TRUE );
						Addin.AppendLogMessage(Database.GetTitle());
						if (AgentArray.GetCount() > 0)
						{	for (b=0;b<int(AgentArray.GetCount());b++)
							{	Agent	= AgentArray.operator [] (b);
								Agent.Open();
								if (Agent.GetIsEnabled())
								{	Name	= " ---> ";
									Name    += Agent.GetName();
									Addin.AppendLogMessage(Name);
									AgentCount++;
									//MyArray[0].AgentName = Agent.GetName();
								}
								Agent.Close();
								//Agent.~LNAgent();
							}
						}
						AgentArray.~LNAgentArray();
						Database.Close();
						Database.~LNDatabase();
					}
					Ausgabe = "MyTask: Suche beendet (";
					Ausgabe += LNString(AgentCount);
					Ausgabe += " aktive Agenten gefunden)";
					Addin.AppendLogMessage(Ausgabe);
					DBArray.~LNDatabaseArray();
				}
				catch (LNSTATUS lnerror)
				{	char ErrorBuf[LNERROR_MESSAGE_LENGTH];
					LNString errormessage;
			        LNGetErrorMessage(lnerror, ErrorBuf, LNERROR_MESSAGE_LENGTH);
					errormessage = "dbbAdmin -> Fehler: ";
					errormessage.Append(ErrorBuf);
					Addin.AppendLogMessage(errormessage);
			    }
			}
		}
    } 
	catch (LNSTATUS lnerror)
    {	ProgramStatus = 1;
		Ausgabe = "MyTask: Es ist ein Fehler aufgetreten - ";
		Ausgabe.Append(lnerror);
		Addin.AppendLogMessage(Ausgabe);
	}
	if (Addin.ShouldAddinTerminate())
	{	
	}
	Addin.AppendLogMessage("ddbAdmin beendet");
	Session.Term();
	return(ProgramStatus);

Des weiteren weiß ich auch nicht, wie ich einen TELL-Befehl auf meinen Task ausführen kann. Vielleicht habt ihr ja auch dazu einen Hinweis.

Vielen Dank

Offline RHolighaus

  • Frischling
  • *
  • Beiträge: 7
    • Software für Lotus Notes und Domino
Re: C++-Task ist speicherhungig
« Antwort #8 am: 29.08.06 - 12:14:33 »
Die C++ API von Domino hat einen eigenen Garbage Collector.
Nach einer gewissen Zeit sollte sich der Speicher auf ein bestimmtes Maß begrenzen - wenn ansonsten kein Fehler existiert.

Die Garbage Collection kannst Du beeinflussen indem Du das Fester der Dominokonsole verkleinerst, dann wird der Speicher bereinigt.
Rolf Holighaus

Offline inu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 594
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: C++-Task ist speicherhungig
« Antwort #9 am: 20.09.06 - 06:43:38 »
@Rolf:

Ja, beim Verkleinern geht der Speicher am teilweise unter 1MByte zurück. Das ist großartig! Dennoch: Bleibt die Konsole offen oder wird über die Livekonsole ein Befehl ausgeführt, wird der Speicher (nach mehreren TELL-Befehlen habe ich bis zu 200 MByte belegt) auch nach angemessener Zeit nicht freigegeben.

Wie kann ich das noch beeinflussen?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz