diff options
author | Benoit Foucher <benoit@zeroc.com> | 2008-05-09 13:41:22 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2008-05-09 13:41:22 +0200 |
commit | 234203502ea515f475a747c5fdeccb054195b195 (patch) | |
tree | 2d859f53f3ddbd2c0a42f344db9586b2a21e13f7 /cpp/src/IceUtil/ArgVector.cpp | |
parent | http://bugzilla/bugzilla/show_bug.cgi?id=3120 - updated demo/IceStorm/replica... (diff) | |
download | ice-234203502ea515f475a747c5fdeccb054195b195.tar.bz2 ice-234203502ea515f475a747c5fdeccb054195b195.tar.xz ice-234203502ea515f475a747c5fdeccb054195b195.zip |
Fixed bug 3128 & 3129 - icepatch2server crash on exit bug
Diffstat (limited to 'cpp/src/IceUtil/ArgVector.cpp')
-rw-r--r-- | cpp/src/IceUtil/ArgVector.cpp | 119 |
1 files changed, 18 insertions, 101 deletions
diff --git a/cpp/src/IceUtil/ArgVector.cpp b/cpp/src/IceUtil/ArgVector.cpp index a9f01088b6e..4f7dc1bc910 100644 --- a/cpp/src/IceUtil/ArgVector.cpp +++ b/cpp/src/IceUtil/ArgVector.cpp @@ -14,135 +14,52 @@ IceUtilInternal::ArgVector::ArgVector(int argc, char *argv[]) { assert(argc >= 0); - _noDelete = false; - copyVec(argc, argc, argv); + _args.resize(argc); + for(int i = 0; i < argc; ++i) + { + _args[i] = argv[i]; + } + setupArgcArgv(); } IceUtilInternal::ArgVector::ArgVector(const ::std::vector< ::std::string>& vec) { - _noDelete = false; - copyVec(vec); + _args = vec; + setupArgcArgv(); } IceUtilInternal::ArgVector::ArgVector(const ArgVector& rhs) { - _noDelete = false; - copyVec(rhs.argc, rhs._origArgc, rhs.argv); + _args = rhs._args; + setupArgcArgv(); } IceUtilInternal::ArgVector& IceUtilInternal::ArgVector::operator=(const ArgVector& rhs) { - ArgVector tmp(rhs); - swap(tmp); + delete[] argv; + argv = 0; + _args = rhs._args; + setupArgcArgv(); return *this; } IceUtilInternal::ArgVector::~ArgVector() { - // - // For use with putenv()--see man putenv. - // - if(!_noDelete) - { - for(int i = 0; i < _origArgc; ++i) - { - delete[] argv[i]; - } - } delete[] argv; } void -IceUtilInternal::ArgVector::setNoDelete() +IceUtilInternal::ArgVector::setupArgcArgv() { - _noDelete = true; -} - -void -IceUtilInternal::ArgVector::copyVec(int argc, int origArgc, char** argv) -{ - this->argc = argc; - this->_origArgc = origArgc; - if((this->argv = new char*[argc + 1]) == 0) - { - throw ::std::bad_alloc(); - } - for(int i = 0; i < argc; ++i) - { - try - { - if((this->argv[i] = new char[strlen(argv[i]) + 1]) == 0) - { - throw ::std::bad_alloc(); - } - } - catch(...) - { - for(int j = 0; j < i; ++j) - { - delete[] this->argv[j]; - } - delete[] this->argv; - throw; - } -#if defined(_MSC_VER) && (_MSC_VER >= 1400) - strcpy_s(this->argv[i], strlen(argv[i]) + 1, argv[i]); -#else - strcpy(this->argv[i], argv[i]); -#endif - } - this->argv[argc] = 0; -} - -void -IceUtilInternal::ArgVector::copyVec(const ::std::vector< ::std::string>& vec) -{ - argc = _origArgc = static_cast<int>(vec.size()); + argc = _args.size(); if((argv = new char*[argc + 1]) == 0) { throw ::std::bad_alloc(); } - for(int i = 0; i < argc; ++i) + for(int i = 0; i < argc; i++) { - try - { - if((argv[i] = new char[vec[i].size() + 1]) == 0) - { - throw ::std::bad_alloc(); - } - } - catch(...) - { - for(int j = 0; j < i; ++j) - { - delete[] argv[j]; - } - delete[] argv; - throw; - } -#if defined(_MSC_VER) && (_MSC_VER >= 1400) - strcpy_s(argv[i], vec[i].size() + 1, vec[i].c_str()); -#else - strcpy(argv[i], vec[i].c_str()); -#endif + argv[i] = const_cast<char*>(_args[i].c_str()); } argv[argc] = 0; } - -void -IceUtilInternal::ArgVector::swap(ArgVector& rhs) throw() -{ - int argcTmp = rhs.argc; - int origArgcTmp = rhs._origArgc; - char** argvTmp = rhs.argv; - bool noDeleteTmp = rhs._noDelete; - rhs.argc = argc; - rhs._origArgc = _origArgc; - rhs.argv = argv; - rhs._noDelete = _noDelete; - argc = argcTmp; - _origArgc = origArgcTmp; - argv = argvTmp; - _noDelete = noDeleteTmp; -} |