<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Referenz auf von new erstellten Speicher]]></title><description><![CDATA[<p>Hallo ich lese grade denn C++ Primer Plus und bin im 12 Kapitel dort gibt es grade ein Code Beispiel. Dabei versteh ich eine Sache nicht. Ich Poste mal den Code und nehme die Stelle die ich nicht verstehe heraus. Hoffe ihr könnt mir da helfen.</p>
<pre><code>// queue.cpp -- Queue and Customer methods
#include &quot;queue.h&quot;
#include &lt;cstdlib&gt; // (or stdlib.h) for rand()
// Queue methods
Queue::Queue(int qs) : qsize(qs)
{
	front = rear = NULL; // or nullptr
	items = 0;
}
Queue::~Queue()
{
	Node * temp;
	while (front != NULL) // while queue is not yet empty
	{
		temp = front; // save address of front item
		front = front-&gt;next;// reset pointer to next item
		delete temp; // delete former front
	}
}
bool Queue::isempty() const
{
	return items == 0;
}
bool Queue::isfull() const
{
	return items == qsize;
}
int Queue::queuecount() const
{
	return items;
}
// Add item to queue
bool Queue::enqueue(const Item &amp; item)
{
	if (isfull())
		return false;
	Node * add = new Node; // create node
	// on failure, new throws std::bad_alloc exception
	add-&gt;item = item; // set node pointers
	add-&gt;next = NULL; // or nullptr;
	items++;
	if (front == NULL) // if queue is empty,
		front = add; // place item at front
	else
		rear-&gt;next = add; // else place at rear
	rear = add; // have rear point to new node
	return true;
}
// Place front item into item variable and remove from queue
bool Queue::dequeue(Item &amp; item)
{
	if (front == NULL)
		return false;
	item = front-&gt;item; // set item to first item in queue
	items--;
	Node * temp = front; // save location of first item
	front = front-&gt;next; // reset front to next item
	delete temp; // delete former first item
	if (items == 0)
		rear = NULL;
	return true;
}
// customer method
// when is the time at which the customer arrives
// the arrival time is set to when and the processing
// time set to a random value in the range 1 - 3
void Customer::set(long when)
{
	processtime = std::rand() % 3 + 1;
	arrive = when;
}
</code></pre>
<pre><code>// queue.h -- interface for a queue
#ifndef QUEUE_H_
#define QUEUE_H_
// This queue will contain Customer items
class Customer
{
private:
	long arrive; // arrival time for customer
	int processtime; // processing time for customer
public:
	Customer() { arrive = processtime = 0; }
	void set(long when);
	long when() const { return arrive; }
	int ptime() const { return processtime; }
};

typedef Customer Item;

class Queue
{
private:
	// class scope definitions
	// Node is a nested structure definition local to this class
	struct Node { Item item; struct Node *next;};
	enum {Q_SIZE = 10};
	// private class members
	Node * front; // pointer to front of Queue
	Node * rear; // pointer to rear of Queue
	int items; // current number of items in Queue
	const int qsize; // maximum number of items in Queue
	// preemptive definitions to prevent public copying
	Queue(const Queue &amp; q) : qsize(0) { }
	Queue &amp; operator=(const Queue &amp; q) { return *this;}
public:
	Queue(int qs = Q_SIZE); // create queue with a qs limit
	~Queue();
	bool isempty() const;
	bool isfull() const;
	int queuecount() const;
	bool enqueue(const Item &amp;item); // add item to end
	bool dequeue(Item &amp;item); // remove item from front
};
#endif
</code></pre>
<pre><code>// bank.cpp -- using the Queue interface
// compile with queue.cpp
#include &lt;iostream&gt;
#include &lt;cstdlib&gt; // for rand() and srand()
#include &lt;ctime&gt; // for time()
#include &quot;queue.h&quot;
const int MIN_PER_HR = 60;
bool newcustomer(double x); // is there a new customer?
int main()
{
	using std::cin;
	using std::cout;
	using std::endl;
	using std::ios_base;
	// setting things up
	std::srand(unsigned int(std::time(0))); // random initializing of rand()
	cout &lt;&lt; &quot;Case Study: Bank of Heather Automatic Teller\n&quot;;
	cout &lt;&lt; &quot;Enter maximum size of queue: &quot;;
	int qs;
	cin &gt;&gt; qs;
	Queue line(qs); // line queue holds up to qs people
	cout &lt;&lt; &quot;Enter the number of simulation hours: &quot;;
	int hours; // hours of simulation
	cin &gt;&gt; hours;
	// simulation will run 1 cycle per minute
	long cyclelimit = MIN_PER_HR * hours; // # of cycles
	cout &lt;&lt; &quot;Enter the average number of customers per hour: &quot;;
	double perhour; // average # of arrival per hour
		cin &gt;&gt; perhour;
	double min_per_cust; // average time between arrivals
	min_per_cust = MIN_PER_HR / perhour;
	Item temp; // new customer data
	long turnaways = 0; // turned away by full queue
	long customers = 0; // joined the queue
	long served = 0; // served during the simulation
	long sum_line = 0; // cumulative line length
	int wait_time = 0; // time until autoteller is free
	long line_wait = 0; // cumulative time in line
	// running the simulation
	for (int cycle = 0; cycle &lt; cyclelimit; cycle++)
	{
		if (newcustomer(min_per_cust)) // have newcomer
		{
			if (line.isfull())
				turnaways++;
			else
			{
				customers++;
				temp.set(cycle); // cycle = time of arrival
				line.enqueue(temp); // add newcomer to line
			}
		}
		if (wait_time &lt;= 0 &amp;&amp; !line.isempty())
		{
			line.dequeue (temp); // attend next customer
			wait_time = temp.ptime(); // for wait_time minutes
			line_wait += cycle - temp.when();
			served++;
		}
		if (wait_time &gt; 0)
			wait_time--;
		sum_line += line.queuecount();
	}
	// reporting results
	if (customers &gt; 0)
	{
		cout &lt;&lt; &quot;customers accepted: &quot; &lt;&lt; customers &lt;&lt; endl;
		cout &lt;&lt; &quot; customers served: &quot; &lt;&lt; served &lt;&lt; endl;
		cout &lt;&lt; &quot; turnaways: &quot; &lt;&lt; turnaways &lt;&lt; endl;
		cout &lt;&lt; &quot;average queue size: &quot;;
		cout.precision(2);
		cout.setf(ios_base::fixed, ios_base::floatfield);
		cout &lt;&lt; (double) sum_line / cyclelimit &lt;&lt; endl;
		cout &lt;&lt; &quot; average wait time: &quot;
			&lt;&lt; (double) line_wait / served &lt;&lt; &quot; minutes\n&quot;;
	}
	else
		cout &lt;&lt; &quot;No customers!\n&quot;;

	cout &lt;&lt; &quot;Done!\n&quot;;

	cin.get();
	cin.get();
	return 0;
}
// x = average time, in minutes, between customers
// return value is true if customer shows up this minute
bool newcustomer(double x){
	return (std::rand() * x / RAND_MAX  &lt; 1);
}
</code></pre>
<pre><code>bool Queue::dequeue(Item &amp; item)
{
	if (front == NULL)
		return false;
	item = front-&gt;item; // set item to first item in queue
	items--;
	Node * temp = front; // save location of first item
	front = front-&gt;next; // reset front to next item
	delete temp; // delete former first item
	if (items == 0)
		rear = NULL;
	return true;
}
</code></pre>
<p>Es also ich gib hier ja meiner Item &amp; temp Referenz von der Main als Parameter(Argument). Dann bekommt es ja den Wert von front-&gt;item bloß dann wird die Speicherstelle die mit new erstellt wurde ja mit delete gelöscht. Warum kann ich dann trotzdem noch mit der Referenz drauf zugreifen? Wird der Wert kopiert ich hatte das so verstanden das eine Referenz nur ein Alias ist aber wovon ein Alias wenn das eigentlich schon gelöscht wurde?</p>
<p>Da der Code funktioniert werde ich wohl irgendwas nicht verstanden haben aber was?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322520/referenz-auf-von-new-erstellten-speicher</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 19:54:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322520.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Dec 2013 22:13:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Wed, 25 Dec 2013 22:13:08 GMT]]></title><description><![CDATA[<p>Hallo ich lese grade denn C++ Primer Plus und bin im 12 Kapitel dort gibt es grade ein Code Beispiel. Dabei versteh ich eine Sache nicht. Ich Poste mal den Code und nehme die Stelle die ich nicht verstehe heraus. Hoffe ihr könnt mir da helfen.</p>
<pre><code>// queue.cpp -- Queue and Customer methods
#include &quot;queue.h&quot;
#include &lt;cstdlib&gt; // (or stdlib.h) for rand()
// Queue methods
Queue::Queue(int qs) : qsize(qs)
{
	front = rear = NULL; // or nullptr
	items = 0;
}
Queue::~Queue()
{
	Node * temp;
	while (front != NULL) // while queue is not yet empty
	{
		temp = front; // save address of front item
		front = front-&gt;next;// reset pointer to next item
		delete temp; // delete former front
	}
}
bool Queue::isempty() const
{
	return items == 0;
}
bool Queue::isfull() const
{
	return items == qsize;
}
int Queue::queuecount() const
{
	return items;
}
// Add item to queue
bool Queue::enqueue(const Item &amp; item)
{
	if (isfull())
		return false;
	Node * add = new Node; // create node
	// on failure, new throws std::bad_alloc exception
	add-&gt;item = item; // set node pointers
	add-&gt;next = NULL; // or nullptr;
	items++;
	if (front == NULL) // if queue is empty,
		front = add; // place item at front
	else
		rear-&gt;next = add; // else place at rear
	rear = add; // have rear point to new node
	return true;
}
// Place front item into item variable and remove from queue
bool Queue::dequeue(Item &amp; item)
{
	if (front == NULL)
		return false;
	item = front-&gt;item; // set item to first item in queue
	items--;
	Node * temp = front; // save location of first item
	front = front-&gt;next; // reset front to next item
	delete temp; // delete former first item
	if (items == 0)
		rear = NULL;
	return true;
}
// customer method
// when is the time at which the customer arrives
// the arrival time is set to when and the processing
// time set to a random value in the range 1 - 3
void Customer::set(long when)
{
	processtime = std::rand() % 3 + 1;
	arrive = when;
}
</code></pre>
<pre><code>// queue.h -- interface for a queue
#ifndef QUEUE_H_
#define QUEUE_H_
// This queue will contain Customer items
class Customer
{
private:
	long arrive; // arrival time for customer
	int processtime; // processing time for customer
public:
	Customer() { arrive = processtime = 0; }
	void set(long when);
	long when() const { return arrive; }
	int ptime() const { return processtime; }
};

typedef Customer Item;

class Queue
{
private:
	// class scope definitions
	// Node is a nested structure definition local to this class
	struct Node { Item item; struct Node *next;};
	enum {Q_SIZE = 10};
	// private class members
	Node * front; // pointer to front of Queue
	Node * rear; // pointer to rear of Queue
	int items; // current number of items in Queue
	const int qsize; // maximum number of items in Queue
	// preemptive definitions to prevent public copying
	Queue(const Queue &amp; q) : qsize(0) { }
	Queue &amp; operator=(const Queue &amp; q) { return *this;}
public:
	Queue(int qs = Q_SIZE); // create queue with a qs limit
	~Queue();
	bool isempty() const;
	bool isfull() const;
	int queuecount() const;
	bool enqueue(const Item &amp;item); // add item to end
	bool dequeue(Item &amp;item); // remove item from front
};
#endif
</code></pre>
<pre><code>// bank.cpp -- using the Queue interface
// compile with queue.cpp
#include &lt;iostream&gt;
#include &lt;cstdlib&gt; // for rand() and srand()
#include &lt;ctime&gt; // for time()
#include &quot;queue.h&quot;
const int MIN_PER_HR = 60;
bool newcustomer(double x); // is there a new customer?
int main()
{
	using std::cin;
	using std::cout;
	using std::endl;
	using std::ios_base;
	// setting things up
	std::srand(unsigned int(std::time(0))); // random initializing of rand()
	cout &lt;&lt; &quot;Case Study: Bank of Heather Automatic Teller\n&quot;;
	cout &lt;&lt; &quot;Enter maximum size of queue: &quot;;
	int qs;
	cin &gt;&gt; qs;
	Queue line(qs); // line queue holds up to qs people
	cout &lt;&lt; &quot;Enter the number of simulation hours: &quot;;
	int hours; // hours of simulation
	cin &gt;&gt; hours;
	// simulation will run 1 cycle per minute
	long cyclelimit = MIN_PER_HR * hours; // # of cycles
	cout &lt;&lt; &quot;Enter the average number of customers per hour: &quot;;
	double perhour; // average # of arrival per hour
		cin &gt;&gt; perhour;
	double min_per_cust; // average time between arrivals
	min_per_cust = MIN_PER_HR / perhour;
	Item temp; // new customer data
	long turnaways = 0; // turned away by full queue
	long customers = 0; // joined the queue
	long served = 0; // served during the simulation
	long sum_line = 0; // cumulative line length
	int wait_time = 0; // time until autoteller is free
	long line_wait = 0; // cumulative time in line
	// running the simulation
	for (int cycle = 0; cycle &lt; cyclelimit; cycle++)
	{
		if (newcustomer(min_per_cust)) // have newcomer
		{
			if (line.isfull())
				turnaways++;
			else
			{
				customers++;
				temp.set(cycle); // cycle = time of arrival
				line.enqueue(temp); // add newcomer to line
			}
		}
		if (wait_time &lt;= 0 &amp;&amp; !line.isempty())
		{
			line.dequeue (temp); // attend next customer
			wait_time = temp.ptime(); // for wait_time minutes
			line_wait += cycle - temp.when();
			served++;
		}
		if (wait_time &gt; 0)
			wait_time--;
		sum_line += line.queuecount();
	}
	// reporting results
	if (customers &gt; 0)
	{
		cout &lt;&lt; &quot;customers accepted: &quot; &lt;&lt; customers &lt;&lt; endl;
		cout &lt;&lt; &quot; customers served: &quot; &lt;&lt; served &lt;&lt; endl;
		cout &lt;&lt; &quot; turnaways: &quot; &lt;&lt; turnaways &lt;&lt; endl;
		cout &lt;&lt; &quot;average queue size: &quot;;
		cout.precision(2);
		cout.setf(ios_base::fixed, ios_base::floatfield);
		cout &lt;&lt; (double) sum_line / cyclelimit &lt;&lt; endl;
		cout &lt;&lt; &quot; average wait time: &quot;
			&lt;&lt; (double) line_wait / served &lt;&lt; &quot; minutes\n&quot;;
	}
	else
		cout &lt;&lt; &quot;No customers!\n&quot;;

	cout &lt;&lt; &quot;Done!\n&quot;;

	cin.get();
	cin.get();
	return 0;
}
// x = average time, in minutes, between customers
// return value is true if customer shows up this minute
bool newcustomer(double x){
	return (std::rand() * x / RAND_MAX  &lt; 1);
}
</code></pre>
<pre><code>bool Queue::dequeue(Item &amp; item)
{
	if (front == NULL)
		return false;
	item = front-&gt;item; // set item to first item in queue
	items--;
	Node * temp = front; // save location of first item
	front = front-&gt;next; // reset front to next item
	delete temp; // delete former first item
	if (items == 0)
		rear = NULL;
	return true;
}
</code></pre>
<p>Es also ich gib hier ja meiner Item &amp; temp Referenz von der Main als Parameter(Argument). Dann bekommt es ja den Wert von front-&gt;item bloß dann wird die Speicherstelle die mit new erstellt wurde ja mit delete gelöscht. Warum kann ich dann trotzdem noch mit der Referenz drauf zugreifen? Wird der Wert kopiert ich hatte das so verstanden das eine Referenz nur ein Alias ist aber wovon ein Alias wenn das eigentlich schon gelöscht wurde?</p>
<p>Da der Code funktioniert werde ich wohl irgendwas nicht verstanden haben aber was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373622</guid><dc:creator><![CDATA[CraftPlorer]]></dc:creator><pubDate>Wed, 25 Dec 2013 22:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Wed, 25 Dec 2013 23:58:00 GMT]]></title><description><![CDATA[<p>temp ist ein zeiger, keine referenz. zwischen den beiden dingen gibt es wichtige unterschiede. also wenn man etwas aus der queue (warteschlange) raus nimmt (vorne natürlich wie bei jeder warteschlange auch die vordersten leute zuerst bedient werden), dann ist ja das neue vorne der eintrag, der davor an zweiter stelle war. für mich sieht es so aus als wäre diese queue als single-linked-list implementiert worden. also ist der zweite eintrag = der nächste eintrag des ersten eintrages. logisch, oder? der zeiger temp merkt sich, wo im speicher das zweite element gespeichert ist (denn das weiss bis dahin nur das erste element, welches ja aus der queue genommen / gelöscht wird). dann kann man getrost das erste element löschen und das neue vorderste element wird das, auf welches der temporäre zeiger zeigt.</p>
<p>ich hoffe, es ist einigermassen verständlich.</p>
<p>frohe weihnachten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373632</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Wed, 25 Dec 2013 23:58:00 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Thu, 26 Dec 2013 00:17:39 GMT]]></title><description><![CDATA[<p>Du meinst wahrscheinlich <code>Item &amp; item</code> , nicht <code>temp</code> ?</p>
<pre><code>item = front-&gt;item; // kopiert front-&gt;item nach item
</code></pre>
<p>Wenn Du dir <code>item</code> als Alias vorstellen willst ist es ein Alias für das der Funktion übergebene Objekt. Da es keine const Referenz ist kann dem Objekt ein neuer Wert zugewiesen werden.</p>
<p>Vielleicht ist es einfacher sich eine Referenz als 'derefenzierter Zeiger' vorzustellen:</p>
<pre><code>bool Queue::dequeue(Item* item)
{
    *item = front-&gt;item; // set item to first item in queue
...
</code></pre>
<p>- osdt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373636</guid><dc:creator><![CDATA[osdt]]></dc:creator><pubDate>Thu, 26 Dec 2013 00:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Thu, 26 Dec 2013 14:04:03 GMT]]></title><description><![CDATA[<p>CraftPlorer schrieb:</p>
<blockquote>
<p>Hallo ich lese grade denn C++ Primer Plus</p>
</blockquote>
<p>Niemals den Primer Plus lesen. Der hat mit dem echten Primer von Moo nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373692</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Thu, 26 Dec 2013 14:04:03 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Thu, 26 Dec 2013 23:51:44 GMT]]></title><description><![CDATA[<p>Ok danke.<br />
Ist das der Kommentar von out ernst zu nehmen? Hab viel gutes zu den C++ Primer Plus gelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373815</guid><dc:creator><![CDATA[CraftPlorer]]></dc:creator><pubDate>Thu, 26 Dec 2013 23:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Thu, 26 Dec 2013 23:59:47 GMT]]></title><description><![CDATA[<p>CraftPlorer schrieb:</p>
<blockquote>
<p>Ist das der Kommentar von out ernst zu nehmen? Hab viel gutes zu den C++ Primer Plus gelesen.</p>
</blockquote>
<p><a href="http://www.c-plusplus.net/forum/322530" rel="nofollow">http://www.c-plusplus.net/forum/322530</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373816</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 26 Dec 2013 23:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Fri, 27 Dec 2013 00:27:56 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>CraftPlorer schrieb:</p>
<blockquote>
<p>Hallo ich lese grade denn C++ Primer Plus</p>
</blockquote>
<p>Niemals den Primer Plus lesen. Der hat mit dem echten Primer von Moo nichts zu tun.</p>
</blockquote>
<p>Ja. Es gibt leider relativ viele Bücher, die nichts taugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373818</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Fri, 27 Dec 2013 00:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Referenz auf von new erstellten Speicher on Fri, 27 Dec 2013 00:29:00 GMT]]></title><description><![CDATA[<p>CraftPlorer schrieb:</p>
<blockquote>
<p>Ok danke.<br />
Ist das der Kommentar von out ernst zu nehmen? Hab viel gutes zu den C++ Primer Plus gelesen.</p>
</blockquote>
<p>Sry, wollte das hier zitieren. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2373819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2373819</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Fri, 27 Dec 2013 00:29:00 GMT</pubDate></item></channel></rss>