Dynamische array-Klasse in c++
Schreibe ich einen dynamischen array-Klasse. Ich habe einen copy-Konstruktor und operator= - Funktion, mir zu erlauben, weisen Sie einem array zu einem anderen. Es funktioniert, wenn ich zuweisen von arrays, die die gleiche Länge der anderen, aber wenn Sie unterschiedliche Längen haben, bekomme ich die compiler-memory-Warnungen und/oder der code-Bomben, ohne Sie auszuführen, je nachdem, ob der linken-array ist größer als der Rechte-hand-array, und Umgekehrt. Ich habe eine Funktion, fügt Werte in das array und denke, dass das Problem vielleicht hier liegen (Anmerkung: ich habe einen Kommentar aus dem Speicher löschen innerhalb der Destruktor für den code gehen).
class Array
{
private:
int * ptr;
int size;
int numElement;
public:
Array();
Array(const int*, int);
Array(const Array&);
~Array();
void setValueAtIndex(int, int);
void insertValueAtEnd(int );
int getArraySize();
const Array& operator=(const Array& );
};
#include "array.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
Array::Array()
{
size = 10;
numElement = 0;
ptr = new int[size];
for (int i = 0; i < size; ++i)
{
ptr[i] = 0;
}
}
Array::Array(const int * ptr_, int size_)
{
size = size_;
numElement = size;
ptr = new int[numElement];
for (int i = 0; i < size; ++i)
{
ptr[i] = ptr_[i];
}
}
Array::Array(const Array& other)
{
size = other.size;
numElement = other.numElement;
if (other.ptr)
{
ptr = new int[numElement];
for(int i = 0; i < size; ++i)
{
ptr[i] = other.ptr[i];
}
if(!ptr)
{
exit(EXIT_FAILURE);
}
}
else ptr = 0;
}
Array::~Array()
{
if(ptr)
{
//delete [] ptr;
//ptr = 0;
}
}
void Array::setValueAtIndex(int a, int b)
{
if(b > size)
{
exit(EXIT_FAILURE);
}
ptr[b] = a;
}
void Array::insertValueAtEnd(int insert)
{
if(numElement == size)
{
size++;
}
ptr[size-1] = insert;
numElement++;
}
int Array::getArraySize()
{
return size;
}
const Array& Array::operator=(const Array& other)
{
if(this != &other)
{
if (ptr)
{
delete [] ptr;
ptr = 0;
}
numElement = other.numElement;
size = other.size;
if(other.ptr)
{
ptr = new int[numElement];
for(int i = 0; i < size; ++i)
{
ptr[i] = other.ptr[i];
}
}
else ptr = 0;
}
return *this;
}
numElement
, aber die Kopie-Schleife verwendet size
. Weiter gibt es ein Leck, wenn das array wurde bereits zugewiesen ist.Was testcase Ursachen des Absturzes?
bitte teilen Sie uns die wichtigsten, konnte ich mich nicht erdrücken, aber es könnte sein, etwas, das ich nicht verstehen
InformationsquelleAutor cadebe | 2013-09-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehrere Probleme mit Ihrem code! Beginnend mit a-Moll ein in den copy-Konstruktor: wenn
new T[n]
ausfällt, kann nicht zurück0
. Stattdessen wirft und Ausnahmen. So, Ihr testif (!ptr)
nie erreicht werden. In deinem code wäre es ohnehin zu spät, da Sie bereits mit den Zeiger!Der Zuweisungsoperator ist völlig verstümmelt! Die Verwendung einer self-assignment-check ist in der Regel ein sehr gutes Indiz dafür, dass der code ist nicht exception-sicher (wenn selbst-Zuordnung wirklich nicht funktionieren würde, ohne diese zu überprüfen), oder dass Sie die Optimierung für einen seltenen Fall (hoffentlich ist Sie keine Objekte zuweisen, die sich selbst mehr als oft auf andere Objekte). In Ihrem Fall ergibt die Prüfung, dass der code, wenn es funktioniert, wäre nicht exception-sicher: Sie beginnen, löschen von Speicher, die Sie nicht bekommen kann zurück, wenn die Zuweisung der Speicher nicht und wirft. Der Haupt-Fehler, wahrscheinlich verursacht Sie Trauer ist, dass Sie reservieren
numElements
Objekte (das scheint zu sein, die Anzahl der Elemente im array, nicht seine Kapazität), aber Sie kopierensize
Objekte (das scheint zu sein, die Anzahl der potenziell verfügbaren Elemente, d.h.,numElements < size
). Als seitliche Anmerkung, ich stark empfohlen, dass Sie den gleichen Namen wie die standard C++ - Bibliothek bietet für seine Container, D. H.,size()
für die Anzahl der tatsächlichen Elemente undcapacity()
für die Anzahl der Elemente, für die der Raum reserviert ist.Alles, was gesagt, der beste Ansatz, um die Umsetzung der Zuweisungsoperator ist zu nutzen, die bereits Geleistete Arbeit für den Kopier-Konstruktor und Destruktor: diese wissen bereits, wie man ein Objekt kopieren und wie, um loszuwerden, das Objekt. Die Möglichkeit dazu sieht wie folgt aus:
Dieser Ansatz erfordert, dass es auch eine Funktion
swap()
können tauschen Sie zwei Objekte des Typs. Jedoch, es ist in der Regel trivial zu schreiben:std::swap()
jedes der Mitglieder.swap
Griff den zugewiesenen Speicher?Sie nicht brauchen, um Durcheinander mit Speicherzuordnung: es ist nur der Austausch aller Mitglieder zwischen zwei verschiedenen Objekten, d.h., es ist nur transfers zugewiesenen Speicher von einem Objekt auf das andere Objekt. Die einzige Zeit, die diese übertragung nicht funktionieren würde, ist, wenn die Zuweisung verwendet verschiedene stateful allocators, aber das ist nicht der Fall, so wie es der Arbeitsspeicher ist in
Array
.InformationsquelleAutor Dietmar Kühl
Dein code bricht mit insertValueAtEnd (), denn es wächst nicht mit der Größe des zugrunde liegenden array. Es stürzte für mich mit diesem einfachen Testfall:
Müssen Sie prüfen, ob Sie noch Kapazität erreicht (Sie nennen es Größe) und wachsen zugrunde liegenden Speicher-wenn dem so ist.
Ich gehe davon aus, dass Sie die Umsetzung eines dynamischen Arrays?
Nur ein Stil-Problem, Sie können Sie ignorieren, wenn Sie möchten. Es ist häufiger zu verwenden name_ Klasse-Mitglieder-Daten und übergeben Sie den Namen als parameter.
InformationsquelleAutor Angus Comber