DER programmier-thread


Recommended Posts

Postinho

nachdem ich schon in einem c++ forum einige mit meinem problem gequält habe und mir nicht direkt einer helfen konnte, stelle ich die frage nun hier, ev. findet sich ja wer, der dieses problem kennt:

zuerst mal den untenstehen code kann man sicher vereinfachen, aber um das sollte es auch nicht gehen.

ich fülle einen vector mit pointern. und so eine klasse die als member einen vector hat wird dann auch noch als array angelegt.

sprich ich habe in diesem beispiel 5 vectoren dem 10000 pointer elemente hinzugefügt wurden mit einer größe von 1024bytes.

so weit so gut.

wenn ich am ende das ganze wieder freigebe, wird jedes vector-daten-element zerstört (bestätigt mir auch valgrind), trotzdem werden mir laut top bei meiner pid in der RES spalte 50mb nicht mehr freigegeben.

kann mir jemand sagen warum das so ist? ich habe auch schon mir einen zweiten dienst gebastelt, der mir den restlichen freien speicher zumüllt, damit ich überprüfen kann ob mir dann das OS den speicher freigibt, leider nein.

das ganze tritt unter linux auf. unter windows gibt es das problem nicht und ist für mich dort auch unwichtig, nur linux zählt in diesem fall :)

#define LIST_COUNT 5 
#define BUFFER_SIZE 1024 
#define BUFFER_ADDS 10000 



class Data 
{ 
public: 
	string name; 

public: 
	Data() {} 
	~Data() {} 
	void Set(const char* _name) {name = _name;} 
}; 

class DataListPointer 
{ 
private: 
	 vector<Data*> dataList;	

public: 
	DataListPointer() {} 
	virtual ~DataListPointer() { } 

	void Clear() 
	{ 
		cout << "DataListPointer::Clear()" << endl; 
		for(uint i=0; i< dataList.size(); i++) 
		{ 
			delete dataList.at(i); 
			dataList.at(i) = NULL; 
		} 
		dataList.clear(); 
		vector<Data*>().swap(dataList); // kann man aufrufen oder weglassen, hat am ende keinen einfluss 
	} 

	void Add(const char *_name) 
	{ 
		Data *dataobj(new Data()); 

		// Name setzen ---- 
		if (_name) dataobj->Set(_name); 

		// Element in Liste hinzfügen 
		dataList.push_back (dataobj); 
	} 
}; 

int main () 
{ 
char buffer[BUFFER_SIZE+1]; 
memset(buffer, 'A', BUFFER_SIZE); 
buffer[BUFFER_SIZE] = '\0'; 


DataListPointer *datalist[LIST_COUNT]; 

for(int idx=0; idx<LIST_COUNT; idx++) 
{ 
	datalist[idx] = new DataListPointer(); 
	for(int i=0; i<BUFFER_ADDS; i++) 
		datalist[idx]->Add(buffer); 
} 

for(int idx=0; idx<LIST_COUNT; idx++) 
{ 
	datalist[idx]->Clear(); 
	delete datalist[idx]; 
	datalist[idx] = NULL; 
} 

while(1) 
	sleep(1); 

}

ev. hat hier ja ein anderer c++ programmierer eine idee. :RiedWachler:

bearbeitet von Taffspeed

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

  • 3 years later...
Captain Awesome

Hallo,

ich grab den Thread mal für mich aus, vielleicht kann mir ja wer helfen:


printf("Hallo mein Name ist %d\n",name);

Was ist daran falsch?

Lg

Wäre hilfreich wenn du sagst welche (Programmier-)Sprache du verwendest. :feier:

bearbeitet von StepDown

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

AAAAlte Zeiten

Hallo, das ist C.

Und name ist der Name den ich eingeben will!!

Poste bitte mal den gesamten Code, da stimmts mit Sicherheit hinten und vorne nicht.

Du willst, dass steht: Hallo mein Name ist Markus (zB).

Und willst du den Namen selbst eingeben oder nicht?

:confused::schluchz:

bearbeitet von FAK-masteR

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Im ASB-Olymp

Also es ist so (habe den Code jetzt nicht bei mir):

eingegeben wird nichts. weiß jetztnicht wie die Zeilen genau ausschauen aber ca so:

void main()

(

char name[5] = Peter;

printf(("Hallo mein Name ist %d\n"),name);

)

bearbeitet von -grünweiß-

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

AAAAlte Zeiten

Also es ist so (habe den Code jetzt nicht bei mir):

eingegeben wird nichts. weiß jetztnicht wie die Zeilen genau ausschauen aber ca so:

void main()
{
char name[6] = "Peter";
printf("Hallo mein Name ist %s\n",name);
}

FYP - müsste hinhaun.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Posting-Pate

Kann mir jemand sagen warum dabei:

// Listing2.2 zeigt die Verwendung von cout

#include <iostream>

using namespace std;

int main()

{

cout << "Hallo dort.\n";

cout << "Hier ist 5: " << 5 << "\n";

cout << "Der Manipulator endl beginnt eine neue Zeile.";

cout <<

endl;

cout << "Hier ist eine große Zahl:\t" << 70000 << endl;

cout << "Hier ist die Summe von 8 und 5:\t" << 8+5 << endl;

cout << "Hier ist ein Bruch:\t\t" << (float) 5/8 << endl;

cout << "Und eine riesengroße Zahl:\t";

cout << (double) 7000 * 7000 <<

endl;

cout << "Vergessen sie nicht, Jesse Liberty durch ihren Namen"

" zu ersetzen...\n";

cout << "Hugo ist ein C++ Programmierer!\n";

return 0;

}

das:

------ Erstellen gestartet: Projekt: huhu, Konfiguration: Debug Win32 ------

1>LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_mainCRTStartup".

1>c:\users\admin\documents\visual studio 2010\Projects\huhu\Debug\huhu.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

rauskommt :huh?deppat?:

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

AAAAlte Zeiten

Kann mir jemand sagen warum dabei:

// Listing2.2 zeigt die Verwendung von cout

#include <iostream>

using namespace std;

int main()

{

cout << "Hallo dort.\n";

cout << "Hier ist 5: " << 5 << "\n";

cout << "Der Manipulator endl beginnt eine neue Zeile.";

cout <<

endl;

cout << "Hier ist eine große Zahl:\t" << 70000 << endl;

cout << "Hier ist die Summe von 8 und 5:\t" << 8+5 << endl;

cout << "Hier ist ein Bruch:\t\t" << (float) 5/8 << endl;

cout << "Und eine riesengroße Zahl:\t";

cout << (double) 7000 * 7000 <<

endl;

cout << "Vergessen sie nicht, Jesse Liberty durch ihren Namen"

" zu ersetzen...\n";

cout << "Hugo ist ein C++ Programmierer!\n";

return 0;

}

das:

------ Erstellen gestartet: Projekt: huhu, Konfiguration: Debug Win32 ------

1>LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_mainCRTStartup".

1>c:\users\admin\documents\visual studio 2010\Projects\huhu\Debug\huhu.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

rauskommt :huh?deppat?:

Was für eine Anwendung hast du denn erstellt?

bearbeitet von FAK-masteR

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Posting-Pate

w32 console, hab das ganze jetzt nochmal in Codeblocks compiliert, und dort funktionierts wunderbar :huh?deppat?:

Ich bleib jetzt mal bei Codeblocks das 2010er Visual Studio hat andauernd was zu meckern so wie zb oben, obwohl ich keinen Fehler finde.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

  • 4 weeks later...
Postinho

gibt es hier leute die sich mit der boost richtig gut auskennen?

kennt jemand eine möglichkeit, dass man zb. bei boost::format eine parameterliste übergibt (va_list) ? oder eine andere funktionalität in der boosst die mir das zulässt?

ich möchte gerne das vsnprintf gegen was "dynamischeren" tauschen, jedoch mit der gleichen performance wie vsnprintf. aja linux-spezifische sachen sind auch erlaubt (in diesem fall zb. open_memstream - jedoch auch fast zu "langsam")

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...


  • Folge uns auf Facebook

  • Partnerlinks

  • Unsere Sponsoren und Partnerseiten

  • Wer ist Online

    • Keine registrierten Benutzer online.