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?
cuserver-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!?
cuvoid 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