objekt aus funktion zurückgeben auto_ptr



  • hi,
    also ich hab folgende konstruktion:
    ich hab ne server-socket klasse die ein socket objekt aus der accept funktion mit auto pointer zurückgibt -> vorteil kein delete
    das problem ist jetzt das der boost::shared_ptr zeigt immer auf 0 zeigt beim beenden des programmes, weil sich kein socket connected....auch richtig so!
    wäre da ein policy_ptr so gut geeignet? oder wie würdet ihr das lösen?
    cu

    server-socket-klasse von socket klasse abgeleitet:
    std::auto_ptr<Socket> accept() const
    {
    	assert(isValid());
    	SOCKET socket = ::accept(socket_, NULL, NULL);
    
    	if(socket == INVALID_SOCKET)
    	{
    		THROW_SOCKET_EXCEPTION("::accept failed!");
    	}
    
            return std::auto_ptr<Socket>(new Socket(socket)); 
    }
    
    server-klasse:
    private: 
         ServerSocket m_serverSocket;
    public:
    void SocketReceive()
    {
    	boost::shared_ptr<Socket> spSocket_;
    	char buffer[1024];
    	unsigned int clientcount = 0;
    
    	while(1)
    	{
    		try
    		{
    			if(clientcount==0) {
    				spSocket_ = m_serverSocket.accept();
    				clientcount++;
    			}
    
    			memset(&buffer, 0, sizeof(buffer)); 
    			spSocket_->receive(buffer, 1024);
    
    			//......
    		}
    		catch(SocketException &e)
    		{
    			clientcount--;
    			std::string str;
    			str = e.show();
    			//MessageBox(NULL, str.c_str(), "error", NULL);
    		}
    	}
    }
    


  • Moin cplusplus,

    in meiner Socket Klasse hat die accept Funktion ne andere Signatur:

    bool socket::accept ( socket& otherSocket )
    

    Juhu, keine Pointer mehr 🙂



  • moin,
    ja so gehts auch...hatte ich mal am anfang,
    aber kann ich da mit policy_ptr nicht nene kleinen hack machen?

    cu



  • das problem ist jetzt das der boost::shared_ptr zeigt immer auf 0 zeigt beim beenden des programmes

    ist doch kein problem



  • anscheinend doch:
    Assertion failed! PRogram: C:\... File: c:\boost..\shared_ptr.hpp Line: 253 Expression: px != 0
    For information on how your program can cause...

    cu



  • int main()
    {
        boost::shared_ptr<int> keinProblem;
    }
    

    läuft! also!



  • in 253 von shared_ptr.hpp steht bei mir

    T * operator-> () const // never throws
    {
       BOOST_ASSERT(px != 0);
       return px;
    }
    

    also ist ja klar das es nicht funktioniert wenn du versuchst darauf zuzugreifen.



  • problem gelöst;-)
    aber was ist ein policy_ptr? in modernc++ sehe ich nur policy klassen!?
    cu

    void SocketReceive()
    	{
    		while(1)
    		{
    			try
    			{
    				if(clientcount==0) {
    					spSocket_ = m_serverSocket.accept();
    					clientcount++;
    				}
    				else {
    					memset(&buffer, 0, sizeof(buffer)); 
    					spSocket_->receive(buffer, 1024);
    				}
    
    				// Farben empfangen
    				if(check_number(buffer[0])) {
    					int surface_color[54];
    					for(unsigned int i=0; i<=strlen(buffer); i++) {
    						std::string b;
    						b = buffer[i];
    						std::stringstream ss(b);
    						ss >> surface_color[i];
    					}
    					rubi.intialize_surface(surface_color);
    				}
    				// Loesungszeuge empfangen
    				else {  
    					boost::mutex::scoped_lock
    						lock(io_mutex);
    
    					movements.clear();
    					movements_done = 0;
    					movements = buffer;
    				}
    			}
    			catch(SocketException &e)
    			{
    				clientcount--;
    				if(clientcount == -1) throw; <--- das vergessen
    			}
    		}
    	}
    private:
    	ServerSocket m_serverSocket;
    	boost::shared_ptr<Socket> spSocket_;
    	char buffer[1024];
    	unsigned int clientcount;
    


  • ok, geklärt:
    = a smart pointer using policies to set how it acts
    lohnt es sich sowas selbst zu bauen?

    cu


Anmelden zum Antworten