Seite 1 von 1

Pointer auf selbe Adresse

Verfasst: 12. August 2010 19:39
von dusti
Ich habe folgenden Code:

Code: Alles auswählen

QList<Interpreter*> *interpreters = new QList<Interpreter*>();

void setInterpreters(QList<Interpreter *> *interp)
{
    this->interpreters = interp;
}
Mein Problem ist, dass der Pointer Interpreters nach der Zuweisung trotzdem nicht auf den selben Speicherbereich zeigt wie die der Funktion übergebenen Variable "interp". Ich weiss aber nicht, wieso das so ist. Ich möchte einfach, dass "Interpreters" auf die selbe Variable zeigt wie "interp", nachdem die Funktion aufgerufen wurde. Für Hilfe bin ich sehr dankbar!

Gruss, dusti

Verfasst: 12. August 2010 20:22
von franzf
Zu wenig Infos. Ist in deinem Beispiel Zeile 1 das interpreters identisch mit dem "this->interpreters", wie vergleichst du die Zeiger, ...
Kannst du ein minimales kompilierbares Beispiel posten? Und bitte auch artikulieren, was du bekommst und was du haben willst!

Ansonsten: Einen Container nicht auf dem HEAP, außer du weißt genau dass du es brauchst und es auch nicht anders geht! Bei dir nicht der Fall. Was willst du genau erreichen? Kann man das nicht auch mit Kopieren des Container erreichen? Du hast ja eh schon Zeiger im Container, da ist eine Kopie ruckzuck erledigt, und die Zeiger darin zeigen immer noch auf die selben Objekte.
Und muss denn gleich der ganze Container kopiert werden? Kannst du deiner Klasse nicht eine Schnittstelle zum Einfügen und Suchen von Interpretern verpassen, so dass du nicht die Kontrolle über den QList<Interpreter*>-Member hergeben musst?

Verfasst: 12. August 2010 22:27
von dusti
Sorry, ich dachte, das Beispiel würde für sich sprechen.
Ja, "this->interpreters" und die Variable interpreters aus der 1. Zeile sind identisch.
Was meinst du mit Vergleichen der Zeiger? Ich möchte den der Funktion übergebenen Zeiger der Variablen interpreters übergebene, ich möchte nichts vergleichen.
Die QList habe ich schon mit guten Gründen auf dem Heap, aber das ist ja für das Beispiel absolut nicht relevant.
Mit Schnittstellen möchte ich in diesem Fall nicht arbeiten, da die Handhabung der Daten so wie ich es habe einfacher und logischer ist.

Ich möchte mit dem Codebeispiel erreichen, dass die Variable(/Pointer) interpreters nach dem Aufruf auf den selben Speicherbereich zeigt wie die übergebene Variable interp. Dies ist aber nicht so, sie zeigen auf verschiedene Adressen und genau dies verstehe ich nicht, eigentlich müssten sie doch auf die selbe Adresse zeigen, oder nicht?

Verfasst: 12. August 2010 22:49
von franzf
Deshalb auch die Frage nach einem minimalen kompilierbaren Beispiel. So etwas halt:

Code: Alles auswählen

#include <iostream>
#include <string>
#include <list>
using namespace std;

class Test {
    list<string*>* list_;
public:
    Test()
     : list_(new list<string*>)
    {
    }
    void setList(list<string*>* newList) {
        cout << list_;
        list_ = newList;
        cout << " " << list_ << " " << newList << endl;
    }
};

int main() {
    int *p = new int(10);
    int *p2 = p;
    cout << p << " " << p2 << endl;
    string* str = new string("Hallo, string");
    string* str2 = str;
    cout << str << " " << str2 << endl;
    Test t;
    t.setList(new list<string*>);
}
Ausgabe:

Code: Alles auswählen

0x1496010 0x1496010
0x1496030 0x1496030
0x1496080 0x14960a0 0x14960a0
Was zu erwarten war. Ergo: Du machst etwas falsch, und ohne Code kann man das nicht rausfinden. (Und bitte keinen Kommentar wegen den MemoryLeaks :P)