auto_ptr
-
Hallo, ich hab ein Problem mit auto_ptr, weiß aber leider in meinem Code nicht wo. Vllt kann mal jemand drüber schauen und mir sagen und/oder einen Tipp geben, wo ich einen Fehler mache.
Danke schonmal

[cpp]#include<iostream>
#include <crtdbg.h>
#include <memory>#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endifusing std::cout;
using std::endl;
using std::auto_ptr;class IntArray
{public:
IntArray();
~IntArray();
IntArray(int dim);
int getDim();
bool setElement(int j, int i);
int zeigFeld();private:
int m_dim;
int *m_izeig;};
IntArray::IntArray()
{
m_dim = 0;
m_izeig = NULL;
}IntArray::IntArray(int dim)
{m_izeig = new int[dim];
m_dim = dim;
for (int i=0; i<dim; i++)
{
m_izeig[i] = 0;
}
}IntArray::~IntArray()
{if(m_izeig != NULL)
delete m_izeig;
m_izeig = 0;
cout << "Destruktor wurde aufgerufen" << endl;
}int IntArray::getDim()
{
return m_dim;
}bool IntArray::setElement(int j, int i)
{
if (i<m_dim)
{
m_izeig[i] = j;
return true;
}
cout << "Feldgröße ist falsch eingegeben: der Elementenwert ist nicht geändert!" << endl;
return false;
}int IntArray::zeigFeld()
{
cout << "Alle Feldelemente werden auf dem Bildschirm ausgegeben!" << endl;
for (int i=0; i<m_dim; i++)
{
cout << "Element " << i << " hat den Wert " << m_izeig[i] << endl;
}
return 0;
}int main()
{
auto_ptr<IntArray> pTest;
{
int meinDim=2;
IntArray objekt1, objekt2(meinDim*=3);auto_ptr<IntArray> pObjekt (new IntArray(4));
//IntArray *pObjekt=new IntArray(4);cout<<"Dynamisch erzeugtes Objekt"<<endl;
(*pObjekt).zeigFeld();
pTest = pObjekt;
//delete pObjekt;
//*pObjekt = 0;
//Hier muss irgendwo ein Fehler liegencout<<"\n\n-------- Objekt1 --------"<<endl;
objekt1.zeigFeld();cout<<"\n\n-------- Objekt2 --------"<<endl;
cout<<"Feldgroesse vom Objekt2 "<<objekt2.getDim()<<endl;
objekt2.setElement(2,meinDim);
objekt2.zeigFeld();
cout<<endl<<endl;}
pTest->zeigFeld();
_CrtDumpMemoryLeaks();
return 0;}[/cpp]
-
Nimm unique_ptr, auto_ptr ist deprecated, und das zu recht.
Im Übrigen darfst du dein Problem ruhig vernünftig beschreiben. Und [cpp]-Tags wären auch nicht schlecht, ebenso ein minimaler Code.
-
Wie man sieht, hab ich eigentlich
benutzt, in der Vorschau war es auch sichtbar, beim abschicken nicht mehr.
Da ich nicht genau weiß, wo das Problem liegt, kann ich es nicht beschreiben. Denn beim Ausführen des Codes wird einfach abgebrochen, mit der Meldung
"Zugriffsverletzung beim Schreiben an Position 0x00000000."
Aber wo ist Posistion 0x00[..]?Achja, leider _muss_ ich auto_ptr verwenden.
int main() { auto_ptr<IntArray> pTest; { int meinDim=2; IntArray objekt1, objekt2(meinDim*=3); auto_ptr<IntArray> pObjekt (new IntArray(4)); //IntArray *pObjekt=new IntArray(4); cout<<"Dynamisch erzeugtes Objekt"<<endl; (*pObjekt).zeigFeld(); pTest = pObjekt; //delete pObjekt; //*pObjekt = 0; //Hier muss irgendwo ein Fehler liegen cout<<"\n\n-------- Objekt1 --------"<<endl; objekt1.zeigFeld(); cout<<"\n\n-------- Objekt2 --------"<<endl; cout<<"Feldgroesse vom Objekt2 "<<objekt2.getDim()<<endl; objekt2.setElement(2,meinDim); objekt2.zeigFeld(); cout<<endl<<endl; } pTest->zeigFeld(); _CrtDumpMemoryLeaks(); return 0; }
-
pTest = pObjekt;Das ist ja das Problem am auto_ptr, das geht nicht, zumindest nicht, wie es die meisten erwarten. (verschiebt den Besitz)
2. Zugriffsverletzungen auf 0x0 sind Dereferenzierungen eines Nullzeigers.EDIT:
//delete pObjekt;eine auto_ptr ist gerade dafür da, das sowas nicht nötig ist.
-
Ich sehe da noch auf Anhieb eine Verletzung der Dreierregel bei der Klasse IntArray und ein delete für ein new[], was natürlich ein delete[] sein müsste. Also, ~IntArray müsste so aussehen:
IntArray::~IntArray() { // if (m_izeig) ist gar nicht nötig, weil // delete mit einem Null-Zeiger nix macht. delete[] m_izeig; }Ich hoffe, der Fragesteller ist sich darüber im Klaren, dass er std::vector<int> statt IntArray verwenden kann.
Was der Kram da in main soll, weiß ich nicht ...
-
aoto_ptr schrieb:
Wie man sieht, hab ich eigentlich
benutzt, in der Vorschau war es auch sichtbar, beim abschicken nicht mehr.
Das liegt da dran, dass du innerhalb des Codes noch Text fett markiert hast. Das verträgt sich nicht mit den Formatierungstags.
-
SeppJ schrieb:
aoto_ptr schrieb:
Wie man sieht, hab ich eigentlich
benutzt, in der Vorschau war es auch sichtbar, beim abschicken nicht mehr.
Das liegt da dran, dass du innerhalb des Codes noch Text fett markiert hast. Das verträgt sich nicht mit den Formatierungstags.
Hätte er es wenigstens formatiert...
int main() { auto_ptr<IntArray> pTest; { int meinDim=2; IntArray objekt1, objekt2(meinDim*=3); auto_ptr<IntArray> pObjekt (new IntArray(4)); //IntArray *pObjekt=new IntArray(4); cout<<"Dynamisch erzeugtes Objekt"<<endl; (*pObjekt).zeigFeld(); pTest = pObjekt; //delete pObjekt; //*pObjekt = 0; //Hier muss irgendwo ein Fehler liegen cout<<"\n\n-------- Objekt1 --------"<<endl; objekt1.zeigFeld(); cout<<"\n\n-------- Objekt2 --------"<<endl; cout<<"Feldgroesse vom Objekt2 "<<objekt2.getDim()<<endl; objekt2.setElement(2,meinDim); objekt2.zeigFeld(); cout<<endl<<endl; } pTest->zeigFeld(); _CrtDumpMemoryLeaks(); }_CrtDumpMemoryLeaksDir ist klar, dass global deklarierte Variablen oder Funktionen, deren Identifier mit einem Unterstrich und einem folgenden Großbuchstaben beginnen, für die Implementierung reserviert sind?
-
Sone schrieb:
_CrtDumpMemoryLeaksDir ist klar, dass global deklarierte Variablen oder Funktionen, deren Identifier mit einem Unterstrich und einem folgenden Großbuchstaben beginnen, für die Implementierung reserviert sind?
_CrtDumpMemoryLeaks wird ja von der "Implementierung" bereitgestellt.

-
krümelkacker schrieb:
Sone schrieb:
_CrtDumpMemoryLeaksDir ist klar, dass global deklarierte Variablen oder Funktionen, deren Identifier mit einem Unterstrich und einem folgenden Großbuchstaben beginnen, für die Implementierung reserviert sind?
_CrtDumpMemoryLeaks wird ja von der "Implementierung" bereitgestellt.

Wie? Was ist denn das, VC++?

-
Sone schrieb:
krümelkacker schrieb:
Sone schrieb:
_CrtDumpMemoryLeaksDir ist klar, dass global deklarierte Variablen oder Funktionen, deren Identifier mit einem Unterstrich und einem folgenden Großbuchstaben beginnen, für die Implementierung reserviert sind?
_CrtDumpMemoryLeaks wird ja von der "Implementierung" bereitgestellt.

Wie? Was ist denn das, VC++?

Guck mal hier: http://msdn.microsoft.com/en-us/library/d41t22sb.aspx
-
Hallo.
Tim06TR schrieb:
pTest = pObjekt;//delete pObjekt;eine auto_ptr ist gerade dafür da, das sowas nicht nötig ist.
Daher hab ich es auskommentiert. Es ist ein älterer Code, den ich gern mit auto_ptr bearbeiten möchte.
SeppJ schrieb:
Das liegt da dran, dass du innerhalb des Codes noch Text fett markiert hast. Das verträgt sich nicht mit den Formatierungstags.[/quote]
Ok, mein Fehler, kommt nicht wieder vor

krümelkacker schrieb:
Ich hoffe, der Fragesteller ist sich darüber im Klaren, dass er std::vector<int> statt IntArray verwenden kann.
Was der Kram da in main soll, weiß ich nicht ...
Ja, das weiß er, aber wie oben beschrieben, ist es eine alte Klasse

Sone schrieb:
_CrtDumpMemoryLeaks_CrtDumpMemoryLeaks wird ja von der "Implementierung" bereitgestellt.

Richtig, das ist auch nicht das eigentliche Problem^^
Ich werde alles nochmal überarbeiten, vllt bekomm ich ja den Fehler weg, danke schonmal für die Tipps
