2010-12-21 11 views

Antwort

8

Mit new bedeutet, dass Sie zu delete [] es erinnern; Wenn Sie Compiler-abhängige Arrays variabler Größe verwenden, verlieren Sie die Portabilität.

Es ist viel besser zu Verwenden Sie einen Vektor.

#include <vector> 

class Graphic 
{ 
    std::vector<int> array; 
    Graphic(int size) 
    { 
     array.resize(size); 
     glGenTextures(size, &array[0]); 
    } 
} 

Die Sprache garantiert, dass Vektorelemente im Speicher zusammenhängend sein wird, so ist es sicher &array[0] hier zu tun.

+0

Ich war mir nicht sicher, wie man einen 'Vektor' mit der Funktion' glGenTextures' verwendet, aber das macht Sinn. Vielen Dank! –

+0

@Jay: Gern geschehen. Sie können Antworten, die Ihnen gefallen, verbessern (Hinweis Hinweis;)). –

+0

@j_random_hacker Ich habe noch keine Upvote-Privilegien, aber ich werde die Antwort in einem Moment akzeptieren. –

1

Nein, der Speicher für temp_array ist auf dem Stack zugeordnet. Wenn die Funktion endet, wird der Speicher freigegeben, und es bleibt nur noch ein fliegender Zeiger übrig. Wenn Sie das Array über den vom Konstruktor zurückgegebenen Punkt hinaus gültig lassen möchten, ordnen Sie es dynamisch mit new zu. Beispiel:

array = new int[size] 

Und dann vergessen Sie nicht, es zu löschen. Typischerweise wird dies in dem destructor wie dies getan:

delete[] array 
+3

Und dann sind Sie natürlich in Schwierigkeiten mit Kopie und Zuordnung. Viel besser, ein 'std: vector' zu verwenden. – sje397

+1

Besser: benutze 'std :: vector' und der Destruktor wird automatisch für dich generiert (zusammen mit früherem Beenden aufgrund einer Exception, etc.). Außerdem wird der ursprüngliche Code nicht einmal kompiliert, der C++ - Standard erfordert, dass "size" in "int temp_array [size];" eine Kompilierzeitkonstante sein muss. –

+0

@Jay: Sie können immer noch 'vector' verwenden. Die Sprache garantiert, dass ihre Elemente zusammenhängend im Speicher sind (genau aus diesem Grund), so dass Sie die Adresse des 1. Elements übernehmen und an 'glGenTextures()' übergeben können. –

Verwandte Themen