string, überladener operator=, AccessViolation???



  • Hallo,

    warum krieg ich in meinem Programm die Fehlermeldung AccessViolation für den Datentyp string im überladenen operator= ???

    #include <malloc.h>
    #include <stdio.h>
    ////////////////////
    #include <iostream>
    #include <string>
    #include <algorithm>
    ////////////////////
    using namespace std;
    
    ////////////////////
    // class TEST
    ////////////////////
    
    class TEST
    {
    private:
    	int		m_iInteger;
    	string	m_sString;
    
    public:
    	TEST(const TEST &a_cTest);
    	TEST();
    	~TEST();
    	TEST& operator=(const TEST &a_cTest);
    };
    
    ////////////////////
    // Default-Constructor
    ////////////////////
    
    TEST::TEST():m_iInteger(50),m_sString("none") {}
    
    ////////////////////
    // Destructor
    ////////////////////
    
    TEST::~TEST(){}
    
    ////////////////////
    // Copy-Constructor
    ////////////////////
    
    TEST::TEST(const TEST &a_cTest)
    {
    	m_iInteger = a_cTest.m_iInteger;
    	m_sString.assign(a_cTest.m_sString);
    }
    
    ////////////////////
    // operator = 
    ////////////////////
    
    TEST&
    TEST::operator=(const TEST &a_cTest)
    {
    	m_iInteger		 = a_cTest.m_iInteger;
    	string t_sString = a_cTest.m_sString; // klappt
    	m_sString		 = a_cTest.m_sString; // Fehlermeldung
    	return *this;
    }
    
    ////////////////////
    // Main
    ////////////////////
    
    int main()
    {
    	TEST t_cTest;
             TEST* t_cTest1=(TEST*)malloc(58);
    
    	for(int i=0;i<20;++i){
    
    		t_cTest1[i]= t_cTest; // springt in operator= -> Fehlermeldung
    	}
    
             if(t_cTest1){
    		free(t_cTest1);
    		t_cTest1 = NULL;
    	}
    
    	return 0;
    }
    


  • Wofür <malloc.h> und <stdio.h>?

    Und findest du nicht, das ein leerer Destruktor inline definiert werden könnte oder sogar gar nicht.

    Und dein Fehler ist klar:

    TEST* t_cTest1=(TEST*)malloc(58);
    

    Erstens wird hier zwar speicher Allokiert, aber der Konstruktor wird nie aufgerufen!!!! Zweitens wieso 58 und nicht sizeof(Test)?

    Also entweder gleich new verwenden oder das Objekt manuell per placement new in dem geholten speicher anlegen.



  • Hallo,

    irgendwie verstehe ich das nicht!!!
    Warum kommt mit new/delete keine Fehlermeldung, mit malloc aber schon??? Liegt es daran, dass TEST eine Klasse ist???

    int main()
    {
    	TEST t_cTest;
             //TEST* t_cTest1=(TEST*)malloc(sizeof(TEST)*20);
    	TEST* t_cTest1 = new TEST[20];
    
    	for(int i=0;i<20;++i){
    		t_cTest1[i]= t_cTest; 
    	}
    
             if(t_cTest1){
    		//free(t_cTest1);
    		delete [] t_cTest1;
    		t_cTest1 = NULL;
    	}
    
    	return 0;
    }
    


  • malloc(foo) besorgt einfach nur speicher, wärend new auch das Objekt konstruiert.

    du kannst also

    Foo * foo = malloc(sizeof(Foo));
    new (foo) Foo;
    

    schreiben oder gleich

    Foo * foo = new Foo;
    

    Wo soll denn deiner Meinung nach der Konstruktor aufgerufen, wenn du einfach nur speicher anforderst?



  • o.k. danke ...


Anmelden zum Antworten