Jump to content
Taffspeed

DER programmier-thread

Recommended Posts

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:

Edited by Taffspeed

Share this post


Link to post
Share on other sites

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:

Edited by StepDown

Share this post


Link to post
Share on other sites

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:

Edited by FAK-masteR

Share this post


Link to post
Share on other sites

Das Programm macht irgendwie keinen Sinn, denn was macht denn das %d da?

Wenn du eine Variable einlesen willst nimm' doch einfach scanf()? :ratlos:

Share this post


Link to post
Share on other sites

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

)

Edited by -grünweiß-

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?:

Share this post


Link to post
Share on other sites

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?

Edited by FAK-masteR

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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")

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...


  • Folge uns auf Facebook

  • Partnerlinks

  • Unsere Sponsoren und Partnerseiten

  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...