<?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[Beste Art ein Array zurückzuliefern]]></title><description><![CDATA[<p>Hallo, der Titel sagt glaub ich alles zu meiner Frage. Ich will eine Funktion schreiben, die mir ein Array zurückliefert. Einfach mit &quot;return&quot; geht das ja nicht. Was ist die beste (heißt für mich vor allem: schnellste) Variante?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/124951/beste-art-ein-array-zurückzuliefern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 05:28:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/124951.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Nov 2005 09:12:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:12:02 GMT]]></title><description><![CDATA[<p>Hallo, der Titel sagt glaub ich alles zu meiner Frage. Ich will eine Funktion schreiben, die mir ein Array zurückliefert. Einfach mit &quot;return&quot; geht das ja nicht. Was ist die beste (heißt für mich vor allem: schnellste) Variante?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906213</guid><dc:creator><![CDATA[MatthiasK]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:20:08 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>weiß nicht was die anderen dazu meinen, aber ich würde es mit pointern lösen, die du deiner fkt als parameter übergibst</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906221</guid><dc:creator><![CDATA[deflow]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:20:08 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:21:11 GMT]]></title><description><![CDATA[<p>static Variablen bleiben auch nach dem Beenden der Funktion erhalten. Allerdings hat diese Variante einen gravierenden Nachteil:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
    using namespace std;

    int* foo(int value)
    {
      static int arr[2];
      arr[0]=value;
      arr[1]=-value;
      return arr;
    }

    int main()
    {
      int* p=foo(7);
      int* p2=foo(9);
      cout&lt;&lt;p[0]&lt;&lt;'\n'&lt;&lt;p[1]&lt;&lt;'\n';
      cout&lt;&lt;p2[0]&lt;&lt;'\n'&lt;&lt;p2[1]&lt;&lt;'\n';

    }
</code></pre>
<p>Wie wir sehen, kann man das delete [] p; leider viel zu leicht vergessen. Das bringt uns zu Variante Nummer 2</p>
<p>Jetzt beliben noch 2 Möglichkeiten mit dynamischen Speicher:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
    using namespace std;

    int* foo(int value)
    {
      int* arr=new int[2];
      arr[0]=value;
      arr[1]=-value;
      return arr;
    }

    int main()
    {
      int* p=foo(7);
      cout&lt;&lt;p[0]&lt;&lt;'\n'&lt;&lt;p[1]&lt;&lt;'\n';
      //delete [] p; //ups vergessen
    }
</code></pre>
<p>cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906223</guid><dc:creator><![CDATA[cplusplus.]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:22:15 GMT]]></title><description><![CDATA[<p>Wie wäre es mit einem std::vector, und darauf ne Referenz? Ist schöner und sicherer als mit Pointern rumzuhantieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906226</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:30:38 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Wie wäre es mit einem std::vector, und darauf ne Referenz? Ist schöner und sicherer als mit Pointern rumzuhantieren.</p>
</blockquote>
<p>Kannst du mir ein einfaches Beispiel dazu hinschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906234</guid><dc:creator><![CDATA[MatthiasK]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:32:09 GMT]]></title><description><![CDATA[<p>Wenn du mir sagst, was der Code ungefähr machen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906236</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:32:09 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:34:24 GMT]]></title><description><![CDATA[<p>In einer Funktion soll ein Array erzeugt werden und dieses an die main-Funktion zurückgegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906241</guid><dc:creator><![CDATA[MatthiasK]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:34:24 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:37:03 GMT]]></title><description><![CDATA[<p>Der Vorteil ist, der vector ist sicherer als arrays, der Nachteil ist, es kostet dich bei unten stehendem Beispiel einmal Kopieren.</p>
<pre><code class="language-cpp">#include &lt;vector&gt;

std::vector&lt;int&gt; createArray() {
  std::vector&lt;int&gt; vec;
  //vec vllt. füllen
  return vec;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/906244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906244</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:52:53 GMT]]></title><description><![CDATA[<p>Ok, danke!</p>
<p>Nun habe ich noch eine Frage: Kann man das folgende auch schneller ausführen?</p>
<pre><code class="language-cpp">void foo(int* array1) {
  int array2[1000];
  for(int i = 0; i &lt; 1000; i++)  array2[i] = array1[i];
}

int main(){
  int array1[1000];
  //Initialisieren von array1
  foo(array1);
  return 0;
}
</code></pre>
<p>Ich möchte also in einer Funktion ein Array möglichst schnell durch ein anderes, das ich bekommen habe, überschreiben. Geht das auch schneller, als durch das Überschreiben jedes einzelnen Elements?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906252</guid><dc:creator><![CDATA[MatthiasK]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 09:56:05 GMT]]></title><description><![CDATA[<p>MatthiasK schrieb:</p>
<blockquote>
<p>Nun habe ich noch eine Frage: Kann man das folgende auch schneller ausführen?</p>
</blockquote>
<p>Ich wüßte jetzt nicht wie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906257</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Wed, 02 Nov 2005 09:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 10:01:38 GMT]]></title><description><![CDATA[<p>Wegen dem Array, das ginge mit Pointern so:</p>
<pre><code class="language-cpp">int * createArray(size_t sz) {
  return new int[sz];
};

void killArray(int *arr) {
  delete [] arr;
};

int main(int argc, char **argv) {
  int *arr = createArray(5);  //erstellen
  //mit arr arbeiten
  killArray(arr);  //löschen
  return 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/906263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906263</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Wed, 02 Nov 2005 10:01:38 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 10:04:11 GMT]]></title><description><![CDATA[<p>Du kannst den Speicherbereich als ganzes kopieren. Ist allerdings nicht so ganz die feine Art (in C durchaus üblich in C++ nur in Ausnahmefällen eine gute Lösung, da man sich dadurch z.B. die Kopierkontruktoren aushebelt).<br />
Generell würde ich auch nicht mit Arrays arbeiten, sondern mit STL-Containern.<br />
Das mag bei einfachen Sachen etwas Zeit kosten, dafür handelt man sich in Bezug auf Sicherheit, Erweiterbarkeit und Zugriff auf die Datenstruktur weniger Probleme ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906265</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Wed, 02 Nov 2005 10:04:11 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 11:44:02 GMT]]></title><description><![CDATA[<p>nächste möglichkeit: shared_array von boost benutzen, anstatt zeigern. im gegensatz zu der möglichkeit, einen vector zurückzugeben, wird hierbei nicht das array intern kopiert(bei einem array mit mehreren 1000 elementen und komplexen copy constructor seeehr teuer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906349</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 02 Nov 2005 11:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 12:39:00 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void foo(int* array1) {
  int array2[1000];

    memcpy( reinterpret_cast&lt;char*&gt;(array2)
        , reinterpret_cast&lt;char*&gt;(array1)
        , sizeof( array2 ) );

}
</code></pre>
<p>Aber wie Matthias schon sagte, das sollte nicht erste Wahl sein.<br />
Vor allem muss man vorsichtig sein, von wo bis wo man kopiert. Man kann den Speicher ganz schön durcheinander bringen damit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906390</guid><dc:creator><![CDATA[GV]]></dc:creator><pubDate>Wed, 02 Nov 2005 12:39:00 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 12:41:15 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>nächste möglichkeit: shared_array von boost benutzen, anstatt zeigern. im gegensatz zu der möglichkeit, einen vector zurückzugeben, wird hierbei nicht das array intern kopiert(bei einem array mit mehreren 1000 elementen und komplexen copy constructor seeehr teuer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />)</p>
</blockquote>
<p>Return Value Optimization.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906391</guid><dc:creator><![CDATA[buzzword]]></dc:creator><pubDate>Wed, 02 Nov 2005 12:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 13:07:08 GMT]]></title><description><![CDATA[<p>Ich würde sagen ob man Zeiger oder Referenz verwenden soll, kommt darauf an, ob man ein Array erzeugen oder modifizieren will. Wenn es erzeugt werden soll, würde ich einen Zeiger verwenden und für das Modifizieren eine Referenz. Hier ein Beispiel mit Ansatz einer Array-Klasse:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

template&lt;typename T&gt;
class Array
{
	T *m_data;
	size_t m_capacity;

public:

	//Default-Konstruktor
	Array()
		: m_data(0), m_capacity(0) {}

	//Konstruktor für ein Array mit bestimmter Kapazität
	explicit Array(size_t capacity)
		: m_data(new T[capacity]), m_capacity(capacity)	{}

	//Konstruktor zum Kopieren aus einem C-Array
	Array(const T *const data, size_t n)
		: m_data(new T[n]), m_capacity(n)
	{
		memcpy(m_data, data, n*sizeof(T));
	}

	//Kopier-Konstruktor
	Array(const Array&amp; prototype)
		: m_data(new T[prototype.m_capacity]), m_capacity(prototype.m_capacity)
	{
		memcpy(m_data, prototype.m_data, m_capacity*sizeof(T));
	}

	//Destruktor
	~Array()
	{
		if(m_data != 0)
			delete[] m_data;
	}

	T &amp;operator[](int index) const
	{
		return m_data[index];
	}

	size_t Capacity() const
	{
		return m_capacity;
	}
};

//Ausgabe-Operator für Array
template&lt;typename T&gt;
ostream &amp;operator&lt;&lt;(ostream &amp;output, const Array&lt;T&gt; &amp;a)
{
	int i;

	output &lt;&lt; &quot;{&quot;;
	for (i=0; i&lt;a.Capacity()-1; ++i)
		output &lt;&lt; a[i] &lt;&lt; &quot;, &quot;;

	if(a.Capacity()&gt;0)
		output &lt;&lt; a[i];

	output &lt;&lt; &quot;}&quot;;
	return output;
}

//erzeugt ein Array-Objekt aus einem C-Array
Array&lt;int&gt; *testCopyFromCArray()
{
	int numbers[] = {38, 432, 543, 6542};
	return new Array&lt;int&gt;(numbers, sizeof(numbers)/sizeof(int));
}

//füllt ein Array mit Abbildungen (Mappings) der Zahlen 1 bis Feldkapazität
template&lt;typename T&gt;
void map(const Array&lt;T&gt; &amp;a, T (*mapping) (T))
{
	for(int i=1; i&lt;=a.Capacity(); ++i)
		a[i-1] = mapping(i);
}

int quad(int x) {return x*x;}

int main()
{
	Array&lt;int&gt; *a = testCopyFromCArray();
	Array&lt;int&gt; b(10);

	cout &lt;&lt; &quot;Kapazit\x84t von a: &quot; &lt;&lt; a-&gt;Capacity() &lt;&lt; endl;
	cout &lt;&lt; &quot;Inhalt von a: &quot; &lt;&lt; *a &lt;&lt; endl;
	delete a;

	map(b, quad);
	cout &lt;&lt; &quot;Kapazit\x84t von b: &quot; &lt;&lt; b.Capacity() &lt;&lt; endl;
	cout &lt;&lt; &quot;Inhalt von b: &quot; &lt;&lt; b;

	cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/906405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906405</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Wed, 02 Nov 2005 13:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 15:13:27 GMT]]></title><description><![CDATA[<p>Ich kann hier keinen Vorteil gegenüber std::vector erkennen ...</p>
<p>MatthiasK schrieb:</p>
<blockquote>
<p>Hallo, der Titel sagt glaub ich alles zu meiner Frage. Ich will eine Funktion schreiben, die mir ein Array zurückliefert. Einfach mit &quot;return&quot; geht das ja nicht. Was ist die beste (heißt für mich vor allem: schnellste) Variante?</p>
</blockquote>
<p>Das kommt darauf an:<br />
- ist die array-grösse statisch und wenn ja, ist diese grösse bereits beim compilieren bekannt ?<br />
- sind die array elemente PODs oder memcopyable oder wenigstens memmovable ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906547</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 02 Nov 2005 15:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 17:16:03 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ich kann hier keinen Vorteil gegenüber std::vector erkennen ...</p>
</blockquote>
<p>größter unterschied: vector hat eine dynamische größe, das array da oben statisch(naja fast^^, zumidnest ist sie nach dem ctor unveränderlich)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906646</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 02 Nov 2005 17:16:03 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 19:38:51 GMT]]></title><description><![CDATA[<p>vielleicht StackAsFixedVector?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906765</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 02 Nov 2005 19:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 21:13:32 GMT]]></title><description><![CDATA[<p>Also zu deiner ersten Frage gibt es mehrere Antworten. Wenn du nicht mit irgendwelchen Libs (stl, oder gar boost) rumhantieren willst, dann lese weiter:</p>
<p>zunächst mal die Möglichkeit, wie sie hier von einigen beschrieben wurde:</p>
<pre><code>int* foo()
{
   int* arr=new int[2];
   // irgendwie, irgendwas
   return arr;
}
</code></pre>
<p>das sieht zwar toll aus, kann aber auch böse sein.</p>
<p>Beispiel?</p>
<pre><code>int main()
{
   foo(); // Hier motzt der Compiler *nicht* rum
   ...
}
</code></pre>
<p>Da fehlt die Speicherfreigabe, muss zwar nicht schlimm sein, kann aber.</p>
<p>Die andere Möglichkeit `a la Win-API, ist einen Zeiger an die Funktion zu übergeben. Der Speicher ist vorher reserviert worden. Kann natürlich auch innerhalb der Funktion gemacht werden. (Und das wird zu einem Problem, wenn man die Varianten mischt)</p>
<pre><code>void foo(int* array, size_t size)
{
</code></pre>
<p>Funktioniert, erfordert aber Durchhaltevermögen und Überblick. Mit C++ kann aber besserer gelöst werden.</p>
<p>Kennst du std::auto_ptr? Damit solltest du auf keinen Fall Arrays verwalten, es wäre aber keine schlechte Idee soetwas für Arrays zu schreiben. Problem: Es kann sehr kompliziert werden. Aber ein Copy&amp;Paste von auto_ptr sollte meistens ausreichend sein. Nur vergiss nicht das entsprechende delete anzupassen.</p>
<p>Nennen wir mal diese neue Klasse auto_array. Dann sieht das Ergebnis in etwa so aus:</p>
<pre><code>auto_array foo()
{

   auto_array&lt;int&gt; arr(new int[2]);
   // irgendwie, irgendwas
   return arr;
}

int main()
{
   foo(); // Am Ende der Funktion wird der Speicher freigegeben.

   auto_array&lt;int&gt; bar = foo();
   // Ich habe schon seit Jahren kein C++ mehr angerührt, 
   // aber hoffe mal das soetwas funktioniert:
   delete [] bar;
}
</code></pre>
<p>Auf deine 2. Frage, ob man die Schleife optimieren kann:<br />
void foo(int* array1) {<br />
int array2[1000];<br />
for(int i = 0; i &lt; 1000; i++) array2[i] = array1[i];<br />
}</p>
<p>Ich habe mal gehört dass ein Vergleich mit 0 schneller gehen soll, als mit einer anderen Zahl. Könnte auch ein Gerücht sein. Probiere einfach. Sonst fällt mir nichts mehr ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906829</guid><dc:creator><![CDATA[1r0ll|&#x5C;&#x2F;|4514h]]></dc:creator><pubDate>Wed, 02 Nov 2005 21:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Wed, 02 Nov 2005 21:25:22 GMT]]></title><description><![CDATA[<p>Muss paar Sachen ergänzen. Ich sende viel zu schnell ab, ohne noch mal durchzulesen.</p>
<p>[quote=&quot;1r0ll|\/|4514h&quot;]</p>
<pre><code>auto_array foo()
{

   auto_array&lt;int&gt; arr(new int[2]);
   // irgendwie, irgendwas
   return arr;
}

int main()
{
   foo(); // Am Ende der Funktion wird der Speicher freigegeben.

   auto_array&lt;int&gt; bar = foo();
   // Ich habe schon seit Jahren kein C++ mehr angerührt, 
   // aber hoffe mal das soetwas funktioniert:
   delete [] bar;
}
</code></pre>
<p>Die Rückgabe der Funktion kann natürlich auch in einem normalen Pointer gespeichert werden:</p>
<pre><code>int* bar = foo();
</code></pre>
<p>Solltest, dann aber mit der Speicherfreigabe aufpassen. auto_array macht aber (alles) automatisch. D.h. das delete [] bar in der Main-Funktion oben wäre garnicht notwendig.</p>
<blockquote>
<p>Auf deine 2. Frage, ob man die Schleife optimieren kann:<br />
void foo(int* array1) {<br />
int array2[1000];<br />
for(int i = 0; i &lt; 1000; i++) array2[i] = array1[i];<br />
}</p>
</blockquote>
<p>Gab es nicht mal soetwas wie std::copy()?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906838</guid><dc:creator><![CDATA[1r0ll|&#x5C;&#x2F;|4514h]]></dc:creator><pubDate>Wed, 02 Nov 2005 21:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Thu, 03 Nov 2005 07:23:08 GMT]]></title><description><![CDATA[<p>1r0ll|/|4514h schrieb:</p>
<blockquote>
<pre><code>auto_array foo()
{

   auto_array&lt;int&gt; arr(new int[2]);
   // irgendwie, irgendwas
   return arr;
}

int main()
{
   foo(); // Am Ende der Funktion wird der Speicher freigegeben.
   
   auto_array&lt;int&gt; bar = foo();
   // Ich habe schon seit Jahren kein C++ mehr angerührt, 
   // aber hoffe mal das soetwas funktioniert:
   delete [] bar;
}
</code></pre>
</blockquote>
<p>Wenn du dein auto_array vernünftig gebaut hast, kümmert sich der Konstruktor selbständig um das delete[] - damit ist die letzte Zeile überflüssig.</p>
<p>@Schleife: Ich würde dort eher auf Bibliotheksfunktionen (std::copy oder strcpy) zurückgreifen als es selber zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/906996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/906996</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 03 Nov 2005 07:23:08 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Thu, 03 Nov 2005 08:37:29 GMT]]></title><description><![CDATA[<p>ein auto_array ist ja ganz nett, aber hat eben leider den nachteil, dass die referenzsemantik überall sichtbar bleibt, ausserdem müssen wir uns noch irgendwie die grösse merken (wenn diese statisch wäre, arbeitet man gleich mit structs (siehe boost::array). also etwa so (entwurf)</p>
<pre><code class="language-cpp">typedef unsigned long long u64; // zwecks alignment
template&lt;class T, class X&gt;
struct enable_if_same
{
};

template&lt;class X&gt;
struct enable_if_same&lt;X, X&gt;
{
    typedef char type;
};

template&lt;typename T&gt;
class Array
{
private:
// wir nehmen union hier, um uns etwas schreibarbeit zu sparen
// wenn T ein POD ist, können wir es nat. einfacher haben - da es dort keinen unterschied macht, ob wir zwischen copy-c'tor oder copy-assign verwenden
    union
    {
        u64* mem_;
        T* array_;
    };
    std::size_t size_;
    struct Ref
    {
        Array* ref_;
        Ref(Array* ref) : ref_( ref ) {}
    };
    operator Ref() { return Ref( this ); } // non-const
public:
    Array() : array_(), size_() {}
    explicit Array(std::size_t size)
    : mem_( new u64[ size_ * sizeof T / sizeof u64 ] ), size_( size ) {}
// Konstruktoren zum Kopieren
    // non-const lvalues - deep copy
    Array(Array&amp; rhs)
    : mem_( new u64[ rhs.size_ * sizeof T / sizeof u64 ] ), size_( rhs.size_ )
    {
// jetzt in abhängigkeit von T:
        for ( std::size_t i = 0; i &lt; size_; ++i )
        {
            new( array_ + i ) T( rhs.array_[ i ] );
        }
// oder per memcpy falls T ein POD ist oder memcopyable ist
// evtl. noch Duff's device für loop-unrolling
    }
    // non-const rvalues (z.B. Funktionsergebnisse) - move
    Array(Ref ref) : mem_( ref.ref_-&gt;mem_ ), size_( ref.ref_-&gt;size_ )
    {
        ref.ref_-&gt;mem_ = 0;
    }
// const lvalue - deep copy
    template &lt;class T&gt;
    Array(T&amp; rhs, typename enable_if_same&lt;Array const,T&gt;::type = 0)
    : // ...
    {
         // siehe Array(Array&amp; rhs) c'tor
    }

    ~Array()
    {
// wenn T einen trivialen destruktor hat, können wir uns das hier sparen:
        for ( std::size_t i = 0; i &lt; size_; ++i )
        {
            array_[ i ].~T();
        }

        delete [] mem_;
    }

    Array&amp; operator=(Array rhs)
    {
        if ( mem_ != 0 ) delete [] mem_;
        mem_ = rhs.mem_;
        rhs.mem_ = 0;
    }

    T&amp; operator[](std::size_t i) { return array_[ i ]; }
    const T&amp; operator[](std::size_t i) const { return array_[ i ]; }

    std::size_t size() const { return size_; }
};
</code></pre>
<p>und schon haben wir ein array, dass sich normal kopieren lässt, aber das kopieren beim rückgeben per funktion vermeidet, so wie es auto_array täte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907049</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Nov 2005 08:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Thu, 03 Nov 2005 20:43:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a> &amp; <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28954">@me</a>: Wieso eigentlich nicht gleich einen std::vector zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907690</guid><dc:creator><![CDATA[1r0ll|&#x5C;&#x2F;|4514h]]></dc:creator><pubDate>Thu, 03 Nov 2005 20:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Thu, 03 Nov 2005 20:47:20 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>das kopieren beim rückgeben per funktion</p>
</blockquote>
<p>Soweit ich weiß können manche Compiler das wegoptimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/907692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907692</guid><dc:creator><![CDATA[1r0ll|&#x5C;&#x2F;|4514h]]></dc:creator><pubDate>Thu, 03 Nov 2005 20:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Beste Art ein Array zurückzuliefern on Thu, 03 Nov 2005 22:36:33 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>warum nicht einfach auf bestehendes wie boost::shared_array oder boost::scoped_array zurückgreifen?</p>
<pre><code class="language-cpp">boost::shared_array&lt;int&gt; MyFuncShared()
{
   boost::shared_array&lt;int&gt; arr( new int[10] );
   for( size_t i = 0; i &lt; 10; ++i)
      arr[i] = i; 
   return arr;
}
boost::scoped_array&lt;int&gt; MyFuncScoped()
{
   boost::scoped_array&lt;int&gt; arr( new int[10] );
   for( size_t i = 0; i &lt; 10; ++i)
      arr[i] = i; 
   return arr;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/907736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/907736</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Thu, 03 Nov 2005 22:36:33 GMT</pubDate></item></channel></rss>